首页 > 解决方案 > Django Rest Framework 嵌套序列化程序创建

问题描述

我无法使用外键保存对象。我有两个类似的 Django 模型(为了这个目的,我将简化它们,但重点仍然存在):

class Model1(models.Model):
    name = models.CharField()

class Model2(models.Model):
    label = models.CharField()
    rel = models.ForeignKey("Model1",  related_name="model2s")

和两个序列化器,如:

class model1SER(serializers.ModelSerializer):
    class Meta:
         model = Model1
         fields = ['pk', 'name']
         

class model2SER(serializers.ModelSerializer):
     rel = model1SER()
     class Meta:
          model = Model2
          fields = "all"

      def create(self, validated_data):
           model2 = Model2.objects.create(**validated_data)
           return model2

我使用 axios POST 发布到 modelViewSet,POST JSON 正文如下所示:
{'label': "xxxx", 'rel': {'pk': 1, 'name': "foo"}}

试图创建一个对象,返回 1)“ rel_id 违反非空... ”或无法分配“OrderedDict([('name':'foo')])”:“Model2.rel”必须是“Model1”实例

并且经过检查,经过验证的数据仅包含: ('rel', OrderedDict([('name', 'foo')]))没有pk

我也尝试用 id 替换 pk,添加 id 等等,但无法使用嵌套序列化程序保存对象。

Model1 Serializer 用于获取所有 Model1 对象的数据。
选择一个后,它被附加到一个Model2 Serializer的post数据中,因此序列化数据的结构保持不变。

我可以更改 create 方法以某种方式获取 valid_data['rel']['pk'] 吗?

谢谢

标签: javascriptdjangorestdjango-rest-framework

解决方案


您可以使用Nested Writable库进行嵌套创建,如 Django Rest Framework 序列化程序中所述。


推荐阅读