Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django嵌套序列化程序allow_null=True_Django_Null_Nested_Serialization - Fatal编程技术网

Django嵌套序列化程序allow_null=True

Django嵌套序列化程序allow_null=True,django,null,nested,serialization,Django,Null,Nested,Serialization,我有一个嵌套序列化程序,我想将allow_null激活为true,但它不起作用 TOP对象具有嵌套的Down对象,相关的_名称必须存在于TOP对象中,但具有空值。如果向下对象不为null,则需要所有向下对象字段 在down对象中包含所有字段的请求示例(这一个很好): 我尝试做的示例:当down对象为null时请求(这个不起作用) 我尝试过“下降”:无或无效,但没有成功 我的看法: # My Views.py class Top(models.Model): class Meta:

我有一个嵌套序列化程序,我想将allow_null激活为true,但它不起作用

TOP对象具有嵌套的Down对象,相关的_名称必须存在于TOP对象中,但具有空值。如果向下对象不为null,则需要所有向下对象字段

在down对象中包含所有字段的请求示例(这一个很好):

我尝试做的示例:当down对象为null时请求(这个不起作用)

我尝试过“下降”:无或无效,但没有成功

我的看法:

# My Views.py

class Top(models.Model):
  class Meta:
    verbose_name = _('Top')
    verbose_name_plural = _('Tops')

  top_guid = models.UUIDField(
    primary_key=True,
    unique=True,
    default=uuid.uuid4,
    editable=False)

  title = models.CharField(
    help_text=_('Title'),
    verbose_name=_('title'),
    max_length=100,
    blank=False
)


class Down(models.Model):
  top = models.OneToOneField(
    Top,
    on_delete=models.CASCADE,
    help_text=_('Top'),
    verbose_name="top",
    related_name="downs"
  )

  type = models.CharField(
    help_text=_('Type'),
    verbose_name=_('type'),
    max_length=30,
    blank=False
  )

  is_external = models.BooleanField(
    help_text=_('external (default = false)'),
    verbose_name=_('external'),
    blank=False,
    default=False
  )
还有我的序列化程序

# My serializers.py

class DownSerializer(serializers.ModelSerializer):
  class Meta:
    model = Down
    fields = '__all__'


class TopSerializer(serializers.ModelSerializer):
  downs = DownSerializer(many=False, required=False, allow_null=True)

  class Meta:
    model = Top
    fields = ('top_guid', 'title', 'downs',)

  def create(self, validated_data):
    """
    Create and return a new `Topic` instance.
    """
    downs_data = validated_data.pop('downs')
    top = Top.objects.create(**validated_data)
    Down.objects.create(top=top, **downs_data)
    return top

  def update(self, instance, validated_data):
    """
    Update and return an existing `Topic` instance.
    """
    # get bim_snippet data and bim_snippet object
    downs_data = validated_data.pop('downs')
    downs = instance.downs

    # update top data and save top object
    instance.title = validated_data.get('title', instance.title)
    instance.top_type = validated_data.get('top_type', instance.top_type)
    instance.save()

    # update down data and save down object
    downs.snippet_type = downs_data.get('type', downs.snippet_type)
    downs.is_external = downs_data.get('is_external', downs.is_external)
    downs.save()

    return instance

非常感谢。

我认为如果在序列化程序类中添加诸如allow\u null=True或read\u only=False之类的参数,则需要重新创建sqlite3数据库。read_only不起作用,但在重新创建数据库后,它工作正常。(makemigrations和migrate似乎不够)

我认为如果在序列化程序类中添加诸如allow\u null=True或read\u only=False之类的参数,则需要重新创建sqlite3数据库。read_only不起作用,但在重新创建数据库后,它工作正常。(makemigrations和migrate似乎还不够)django magic的另一个+1,不得不删除数据库并重新创建它,因为序列化程序已经更改(模型没有更改),令人惊讶
# My Views.py

class Top(models.Model):
  class Meta:
    verbose_name = _('Top')
    verbose_name_plural = _('Tops')

  top_guid = models.UUIDField(
    primary_key=True,
    unique=True,
    default=uuid.uuid4,
    editable=False)

  title = models.CharField(
    help_text=_('Title'),
    verbose_name=_('title'),
    max_length=100,
    blank=False
)


class Down(models.Model):
  top = models.OneToOneField(
    Top,
    on_delete=models.CASCADE,
    help_text=_('Top'),
    verbose_name="top",
    related_name="downs"
  )

  type = models.CharField(
    help_text=_('Type'),
    verbose_name=_('type'),
    max_length=30,
    blank=False
  )

  is_external = models.BooleanField(
    help_text=_('external (default = false)'),
    verbose_name=_('external'),
    blank=False,
    default=False
  )
# My serializers.py

class DownSerializer(serializers.ModelSerializer):
  class Meta:
    model = Down
    fields = '__all__'


class TopSerializer(serializers.ModelSerializer):
  downs = DownSerializer(many=False, required=False, allow_null=True)

  class Meta:
    model = Top
    fields = ('top_guid', 'title', 'downs',)

  def create(self, validated_data):
    """
    Create and return a new `Topic` instance.
    """
    downs_data = validated_data.pop('downs')
    top = Top.objects.create(**validated_data)
    Down.objects.create(top=top, **downs_data)
    return top

  def update(self, instance, validated_data):
    """
    Update and return an existing `Topic` instance.
    """
    # get bim_snippet data and bim_snippet object
    downs_data = validated_data.pop('downs')
    downs = instance.downs

    # update top data and save top object
    instance.title = validated_data.get('title', instance.title)
    instance.top_type = validated_data.get('top_type', instance.top_type)
    instance.save()

    # update down data and save down object
    downs.snippet_type = downs_data.get('type', downs.snippet_type)
    downs.is_external = downs_data.get('is_external', downs.is_external)
    downs.save()

    return instance