2017-02-10 9 views
0

У меня есть вложенный сериализатор, и я хочу активировать allow_null в true, но он не работает.Django вложенный сериализатор allow_null = True

Объект TOP имеет вложенный объект Down, связанное имя должно присутствовать в объекте TOP, но с нулевым значением. Если нисходящий объект не является нулевым, требуются все поля объекта вниз.

Пример запрос со всеми полями понижающим объектом (это работает отлично):

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

Пример, который я судимый сделать: запрос, когда вниз объект является нулевым (это один не работает)

{ 
    "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

Я думаю, что если вы добавите в класс serializer аргументы типа allow_null = True или read_only = False, вам нужно заново создать базу данных sqlite3. read_only не работал, но сразу после воссоздания db он отлично работает. (makemigrations и migrate кажутся недостаточно) – Bat

ответ

0

Я думаю, что если вы добавите в класс serializer аргументы типа allow_null = True или read_only = False, вам нужно заново создать базу данных sqlite3. read_only не работал, но сразу после воссоздания db он отлично работает. (makemigrations и migrate кажутся недостаточными)

Смежные вопросы