2017-02-10 98 views
0

我有一个嵌套的序列化程序,我想激活allow_null为true,但它不起作用。Django嵌套序列化程序allow_null =真

TOP对象有一个嵌套的Down对象,related_name必须出现在TOP对象中,但是具有空值。如果down对象不为null,则所有向下对象字段都是必需的。在下降的对象所有领域

实例请求(这一个正常工作):

{ 
    "title": "Titre new rgfdgfdgthtrh", 
    "downs": { 
    "type": "Type example", 
    "is_external": true, 
    }, 
} 

的例子,我tryed做:请求时向下对象为空(这一个不工作)

{ 
    "title": "Titre new ", 
    "downs": {}, 
} 

我尝试过“跌落”:没有或没有成功。

我的观点:

# 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 

感谢的很多。

+0

我认为,如果您在序列化程序类中添加诸如allow_null = True或read_only = False的参数,则需要重新创建sqlite3数据库。 read_only无法正常工作,但在重新创建数据库后,它正常工作。 (makemigrations和迁移似乎是不够的) – Bat

回答

0

我认为如果你在序列化类中添加像allow_null = True或read_only = False这样的参数,你需要重新创建你的sqlite3数据库。 read_only不起作用,但重新创建数据库后,它工作正常。 (makemigrations和迁移似乎是不够的)