Django引用外键时的要点,报错Object of type xxx is not Json serializable

文章讲述了在Django中遇到的问题,即在使用外键时,应使用属性_id来获取值,如address.province_id,而不是address.province。province_id是Django为外键自动创建的。同时,如果需要引用外键的属性,如name,可以直接使用address.province.name。错误地引用外键对象会导致无法正确序列化返回给前端。
摘要由CSDN通过智能技术生成
快速了解本文当引用外键属性时候,应该是 属性_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是挂载了外键的实例,那当然可以 .属性 引用啦。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值