2017-02-10 3 views
0

J'ai un sérialiseur imbriqué et je veux activer le allow_null à vrai, mais cela ne fonctionne pas.serializer Django imbriqué allow_null = True

L'objet TOP a un objet Down imbriqué, le nom_lié doit être présent dans l'objet TOP mais avec une valeur null. Si l'objet descendant n'est pas nul tous les champs d'objet vers le bas sont requis.

demande Exemple avec tous les champs objet vers le bas (celui-ci fonctionne très bien):

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

exemple que j'ai essayé de le faire: demande quand vers le bas objet est nul (celui-ci ne fonctionne pas)

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

J'ai essayé avec "downs": None ou Null sans succès.

Mes vues:

# 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 
) 

et mes serializers

# 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 

Remerciez est beaucoup.

+0

Je pense que si vous ajoutez des arguments comme allow_null = True ou read_only = False dans votre classe de sérialiseur, vous devez recréer votre base de données sqlite3. Read_only ne fonctionnait pas, mais juste après recréer la base de données, cela fonctionne très bien. (makemigrations et migrer semble ne pas être suffisant) – Bat

Répondre

0

Je pense que si vous ajoutez des arguments comme allow_null = True ou read_only = False dans votre classe de sérialiseur, vous devez recréer votre base de données sqlite3. read_only ne fonctionnait pas, mais juste après recréer le db ça marche bien. (makemigrations et migrate ne semblent pas suffisants)