django - “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
...
解决方案
当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)
推荐阅读
- typescript - 如何仅在 WebStorm 和 Visual Studio 开启时运行自动热键脚本?
- node.js - 写入createReadStream内容创建的文件与原始数据不匹配
- javascript - 使用 Jquery 在日期中添加天数
- r - Matchit 包中的警告(“Glm.fit:出现数字 0 或 1 的拟合概率”)如何处理?
- twilio - 不欺骗电话
- python - Python Falcon 和 Axios:无法允许 CORS
- r - R for 循环结果
- excel - 如何从 Excel 值更改日期和时间格式?
- winapi - winapi - AppendMenu - 文本布局
- sql-server - 使用 max(date) 返回单个日期