django restframework我要更新一个外键怎么处理?

发布于 2022-09-03 08:12:01 字数 1165 浏览 10 评论 0

有这么一个model, category是一个外键

class Goods(Model):
    name = CharField(max_length=255)
    category = ForeignKey(CategoryModel)

然后我用rest framework封装一个接口出去

class GoodsSerializer(Serializers.ModelSerializer):
    class Meta:
        model = Goods
        fields = ('name', 'category')

但当我用http-patch方法,更新category的时候传入参数

{category:2}

这时报错:

{"category":{"non_field_errors":["Invalid data. Expected a dictionary, but got unicode."]}}

传参数:

{category:{id: 2}}

继续报错

The `.update()` method does not support writable nestedfields by default.

查文档,说涉及外键的要自己封闭update方法。好,自己在GoodsSerializer中增加update()方法

 def update(self, instance, validated_data):
        category = validated_data.get('category', instance.category)
        instance.save(category_id=category.id, **validated_data)

但是还是报错,打断点,看到validated_data中的内容如下:

{u'category': OrderedDict()}

category是一个空的OrderedDict。
这是怎么回事呢?

我要是想要更新goods的category,正确的做法应该是怎么呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜光 2022-09-10 08:12:01

估计楼主使用客户端不正确所致
请看看这个错误,并作对比
这是我实验服务器代码地址:https://github.com/uxlsl/shop_test
下面是客户端
假设接口是这样的http://127.0.0.1:8000/goods/{pk}/
使用requests做客户端发送数据

import json
import requests
data={'category': 2}
r = requests.patch('http://127.0.0.1:8000/goods/1/', json=json.dumps(data))

print(r.text)

这时就会打印
u'{"non_field_errors":["Invalid data. Expected a dictionary, but got unicode."]}'

修改将json.dumps(data)改成data

打印就会是这个, 成功更新goods的category
{"name":"apple","category":2}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文