Reputation: 301
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 serializerBranchSerializer
. The serializer field might be named incorrectly and not match any attribute or key on thebytes
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
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 Branch
es 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