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.
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