快速了解本文:
当引用外键属性时候,应该是 属性_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是挂载了外键的实例,那当然可以 .属性 引用啦。