Reputation: 558
I have this model city and trying to get foreign table data
models.py:
class City(BaseModel):
name = models.CharField(_("City Name"), max_length=80, null=False, blank=False)
state_name = models.ForeignKey(State, to_field="uid", on_delete=models.DO_NOTHING, max_length=55, null=False, blank=False)
city_type = models.ForeignKey(TypeOfCity, to_field="key", on_delete=models.DO_NOTHING, max_length=15, null=False, blank=False)
city_tier = models.ForeignKey(CityTier, to_field="key", on_delete=models.DO_NOTHING, max_length=10, null=False, blank=False)
status = models.SmallIntegerField(_("Status: 1 for Active; 0:Inactive"), default=1)
class TypeOfCity(models.Model):
key = models.CharField(verbose_name=_("key"), max_length=15, unique=True)
value = models.CharField(verbose_name=_("value"), unique=True, max_length=15)
status = models.SmallIntegerField(_("status:1 for Active; 0: Inactive"), default=1)
views.py:
@api_view(['POST'])
def cityFetch(request):
try:
data =decode_data(request.data.copy())
try:
queryset = City.objects.filter(uid=data['uid']).values('name','city_type','city_type__value','status')
serializer_obj = CitySerializer(queryset,many=True)
return CustomeResponse(request=request, comment="Get Single City", message="Get Single City", data=json.dumps(serializer_obj.data, cls=UUIDEncoder), status=status.HTTP_200_OK)
except City.DoesNotExist:
return CustomeResponse(request=request, comment="City Not Found", message="City Not Found",data=json.dumps({}, cls=UUIDEncoder), status=status.HTTP_400_BAD_REQUEST, validate_errors=1)
except Exception as e:
print(e)
error_str = UID_KEY_IS_MISSING if type(e) is KeyError else UID_IS_NOT_VALID
return CustomeResponse(request=request, log_data=json.dumps(str(e), cls=UUIDEncoder), comment=error_str, message=error_str, data=json.dumps({}, cls=UUIDEncoder), status=status.HTTP_400_BAD_REQUEST, validate_errors=1)
I am getting this queryset:
<QuerySet [{'name': 'test', 'city_type': 'normal_city', 'city_type_id__value': 'Normal City', 'status': 1}]>
but maybe it's trying to find the key and I am getting this error: 'str' object has no attribute 'key'
def decode_data(data):
try:
if data.get('encoded_data', None)=="yes":
try:
output = ast.literal_eval(decrypt(data.get('data', None)).decode('utf-8'))
except Exception as e:
output = json.loads(decrypt(data.get('data', None)).decode('utf-8'))
else:
return output
except Exception as e:
output = data.get('data', None)
return output
...
Upvotes: 0
Views: 357
Reputation: 3360
When CitySerializer
gets the key city_type
, it presumes that city_type
is a TypeOfCity
instance. Yet in your queryset city_type
is merely a string. The error you have basically says "The serializer expected the key
attribute from TypeOfCity
class to be present, but it's not".
So before passing on the queryset to the serializer, turn city_type
into a TypeOfCity
instance first:
queryset = City.objects.filter(uid=data['uid']).values('name','city_type','city_type__value','status')
cities = []
for city in queryset:
city.city_type = TypeOfCity.objects.get(value=city.city_type) # this line largely depends on your code but you should get the gist
cities.append(city)
serializer_obj = CitySerializer(cities,many=True)
You can make the serializer do this work for you. Use nested serializers and make them writable.
Upvotes: 1