Ошибка получения атрибута при использовании icontains - PullRequest
1 голос
/ 11 апреля 2020

мой класс двух моделей:

class Bank(models.Model):
    name = models.CharField(max_length=200)

    def __str__(self):
        return self.name

class Branch(models.Model):
    ifsc        = models.CharField(max_length=200)
    name        = models.CharField(max_length=200)
    address     = models.TextField(max_length=200)
    city        = models.CharField(max_length=200)
    state       = models.CharField(max_length=200)
    bank        = models.ForeignKey(Bank, on_delete=models.CASCADE,max_length=200)

    def __str__(self):
        return f"{self.name}"

классы сериализатора,

class BankSerializer(serializers.ModelSerializer):
    class Meta:
        model = Bank
        fields = '__all__'

class BranchSerializer(serializers.ModelSerializer):
    bank = serializers.CharField(source='bank.name', read_only=True)
    class Meta:
        model = Branch
        fields = ["ifsc","name","address","city","state","bank"]

и Views.py

class CityBankNameView(APIView):

    def get_object(self, bank_name, city_name):
        try:
            bank   = Bank.objects.get(name=bank_name)
            branches = Branch.objects.filter(bank__icontains=bank, city=city_name) #<-- icontains
            return branches
        except:
            return HttpResponse(status=status.HTTP_404_NOT_FOUND)

    def get(self,request, bank_name, city_name):
        branches = self.get_object(bank_name, city_name)
        serializer = BranchSerializer(branches, many=True)
        return Response(serializer.data)

Я получаю ошибку атрибута при использовании bank__icontains

точная ошибка:

AttributeError в / Branches / DELHI / AXIS BANK Ошибка AttributeError при попытке получить значение для поля ifsc в сериализаторе BranchSerializer. Поле сериализатора может иметь неправильное имя и не соответствовать ни одному атрибуту или ключу в экземпляре bytes. Исходный текст исключения был: у объекта 'bytes' нет атрибута 'ifs c'.

Я пытаюсь часами, но не могу найти никакого решения. Я видел разные ответы, но ни один из них не помогает решить этот вопрос

1 Ответ

1 голос
/ 11 апреля 2020

bank__icontains= ожидает, что bank будет строковым объектом, а не Bank объектом. Таким образом, вы можете переписать запрос следующим образом:

branches = Branch.objects.filter(<b>bank=bank</b>, city=city_name)

или если вы хотите, чтобы Branch es, для которых name из bank содержит bank_name, вы можете отфильтровать с помощью:

branches = Branch.objects.filter(<b>bank__name__icontains=bank_name</b>, city=city_name)
...