2017-02-10 52 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和遷移似乎是不夠的)

相關問題