首页 > 解决方案 > “str”对象没有属性“key”django drf

问题描述

我有这个模型城市并试图获取外部表数据

模型.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)

视图.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)

我得到这个查询集:

<QuerySet [{'name': 'test', 'city_type': 'normal_city', 'city_type_id__value': 'Normal City', 'status': 1}]>

但也许它正在尝试找到密钥并且我收到此错误: '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
...

标签: djangopython-3.xdjango-rest-framework

解决方案


CitySerializer得到 keycity_type时,它假定它city_type是一个TypeOfCity实例。然而,在您的查询集中city_type只是一个字符串。您的错误基本上是说“序列化程序期望类中的key属性TypeOfCity存在,但事实并非如此”。

所以在将查询集传递给序列化器之前,先city_type变成一个TypeOfCity实例:

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)

您可以让序列化程序为您完成这项工作。使用嵌套的序列化器并使它们可写


推荐阅读