aman goyal
aman goyal

Reputation: 301

Getting Attribute error on using icontains

my two model class:

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}"

serializer classes,

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"]

and 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)

I am getting attribute error when using bank__icontains

exact error:

AttributeError at /branches/DELHI/AXIS BANK Got AttributeError when attempting to get a value for field ifsc on serializer BranchSerializer. The serializer field might be named incorrectly and not match any attribute or key on the bytes instance. Original exception text was: 'bytes' object has no attribute 'ifsc'.

I am trying for hours but cannot find any solution to it. I seen various answers but none of them helps solve this one

Upvotes: 1

Views: 127

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 477676

bank__icontains= expects bank to be a string object, not a Bank object. You can thus rewrite the query to:

branches = Branch.objects.filter(bank=bank, city=city_name)

or if you want the Branches for which the name of the bank contains bank_name, you can filter with:

branches = Branch.objects.filter(bank__name__icontains=bank_name, city=city_name)

Upvotes: 1

Related Questions