【问题标题】:How can make field optional in django rest nested serializer如何在 django rest 嵌套序列化程序中使字段可选
【发布时间】:2016-02-26 06:17:18
【问题描述】:

我有这个代码

# Models

class Parent(models.Model):
        something = models.CharField(max_length=255)

class Child1(models.Model):
        thing = models.BooleanField()
        parent = models.ForeignKey(Parent)

    # Serializers

class Child1Serializer(BaseSerializer):

    class Meta:
        model = Child1
        fields = ('thing', 'parent')

class Child2Serializer(BaseSerializer):

    class Meta:
        model = Child2
        fields = ('thing', 'parent')

class ParentSerializer(BaseSerializer):
    sisters = Child1Serializer(many=True)
    cousins = Child2Serializer(many=True)

现在,当我在 Child1 中发帖,然后在 json 中传递父级时,一切正常

但是当我想编写嵌套的父序列化程序时,子也会自动创建

"sisters": [
   {
      "thing": "tom"
   }
],
"cousins": [
   {
      "thing": "mike"
   },
]

然后我不需要传递 parent,因为我将在 create 方法中手动分配

def create(self, validated_data):
    sisters = validated_data.pop('sisters')
    parent = Parent.objects.create(**validated_data)
    for obj in sisters:
        Child1.objects.create(parent=parent, **obj)
    return parent

问题是当我发布父级时,我收到验证错误,在姐妹中,该父级是必需的

【问题讨论】:

  • 尝试使用 django smart-select
  • 在创建父级之前,您是否从validated_data 弹出cousins
  • @Anush 不,这只是例子

标签: python json django django-rest-framework


【解决方案1】:

您根本不需要嵌套序列化程序中的parent 字段。发送到 API 的数据是多余的。

【讨论】:

  • 你的意思是我在子序列化器中不需要父母?
  • 没错。它与父项重复,不是吗?
  • 请注意,通过编写“Child1.objects.create(parent=parent, **obj)”,您已经提供了父级。来自嵌套子序列化程序的 obj 没有理由也带来它。另外 Python 会抱怨有两次相同的论点。
  • 你是对的。但是,如果我也发布 PARENT 对象来创建 CHILD,那么您的观点是有效的。但是,如果我只发布子项,那么父项将不会出现在经过验证的数据中,因为如果我没有在字段中定义它,序列化程序将删除它
  • 不是您的代码显示的内容 (parent = Parent.objects.create(**validated_data))
猜你喜欢
  • 1970-01-01
  • 2015-03-27
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多