afk
afk

Reputation: 558

'str' object has no attribute 'key' django drf

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

Answers (1)

Pavel Vergeev
Pavel Vergeev

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

Related Questions