快速了解本文:当引用外键属性时候,应该是 属性_id,例如 b是model A的外键属性,应用A.b_id来获取b对应的属性值。
以下是具体分析
报错截图如下:


问题不难发现,provice_id:后面是一个Area对象实例,无法json序列化返回给前端。
问题差在哪里呢?
来看简要分析:
models
class Area(models.Model):
....
name = models.CharField(max_length=20, verbose_name='Province Name')
parent = models.ForeignKey('self',
on_delete=models.SET_NULL,
related_name='subs',
null=True,
blank=True,
)
class Address(models.Model):
....
title = models.CharField(max_length=30, verbose_name="title")
province = models.ForeignKey(Area, on_delete=models.PROTECT, related_name='province_address',verbose_name='province_name')
两个简化的模型,去除多余的字段来看外键
上图 Address 的province字段关联了Area
外键可以理解为,province挂载了一个Area实例
class AddressView(View):
....
address = Address.objects.create(
province_id=province_id,
title=title
)
address.save()
data = {"code": 0, "msg": "OK", "address": {
"id": address.id,
"title": address.title,
"province_id": address.province,
}}
return JsonResponse(data)简化了视图,来看如何 错误地 引用address的外键对象
address.province,你猜会得到什么?
得到address.<Object Area>,这样返回不是前端想要的数据格式。
其实外键属性都自动创建了_id替代原有字段,要用address.province_id才能得到具体数据。
这是django独特的地方,今天领教了~

这里就可以清晰的看到address表里有province_id但没有province字段,印证了上面所说的。
class Address(View):
....
address.save()
data={"code":0,"msg":OK,"address”:{
"id":address.id,
"province":address.province.name
}
}如果想引用外键的属性name,那就直接address.province.name,因为address.province是挂载了外键的实例,那当然可以 .属性 引用啦。
文章讲述了在Django中遇到的问题,即在使用外键时,应使用属性_id来获取值,如address.province_id,而不是address.province。province_id是Django为外键自动创建的。同时,如果需要引用外键的属性,如name,可以直接使用address.province.name。错误地引用外键对象会导致无法正确序列化返回给前端。
687

被折叠的 条评论
为什么被折叠?



