web-dev-qa-db-fra.com

Django REST Champ de sérialiseur de structure requis = false

de la documentation:

lecture seulement Définissez-le sur True pour vous assurer que le champ est utilisé lors de la sérialisation d'une représentation, mais pas lors de la mise à jour d'une instance lors de la désérialisation.

La valeur par défaut est False

champs obligatoires Normalement, une erreur est générée si un champ n'est pas fourni pendant la désérialisation. Définissez sur false si la présence de ce champ n'est pas obligatoire pendant la désérialisation.

La valeur par défaut est True.

Donc, j'ai un modèle qui a un champ qui n'est pas nullable mais je veux qu'il soit rempli dans la méthode pre_save, donc j'ai défini le champ à required=False dans le sérialiseur, mais cela ne semble pas fonctionner. Je reçois toujours une erreur lors de la sauvegarde de l'enregistrement.

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(required=False)
    class Meta:
        model = models.FavoriteList

Mise à jour: J’ai ajouté serializer_class = serializers.FavoriteListSerializer au ViewSet, au lieu d’obtenir This field is required, ce qui, je pense, a dépassé la validation mais j’obtiens This field cannot be null..

23
James Lin

Ouais, j'ai aussi rencontré ce problème à un moment donné. Vous devez également mettre à jour les exclusions de validation.

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(required=False)
    class Meta:
        model = models.FavoriteList

    def get_validation_exclusions(self):
        exclusions = super(FavoriteListSerializer, self).get_validation_exclusions()
        return exclusions + ['owner']
33
Kevin Stone

Si quelqu'un arrive avec un problème similaire, portez une attention particulière aux attributs suivants, ainsi que required:

allow_blank

Si défini à True, la chaîne vide doit être considérée comme une valeur valide.

permettre null :

Normalement, une erreur sera générée si None est passé à un champ du sérialiseur.

Champs obligatoires :

Normalement, une erreur est générée si un champ n'est pas fourni pendant la désérialisation.

J'avais du mal à comprendre pourquoi j'obtenais une erreur de validation avec required=False où j'avais manqué l'attribut allow_null.

10
Wtower

Entrée tardive à ce fil. Ce problème a été résolu dans Django-rest-framework 2.3.13 . Voici le lien du PR .

3
Pankaj Singhal

Je suppose que la méthode .get_validation_exclusions () est maintenant supprimée. Je ne l'ai pas trouvé dans ModelSerializer doc et il ne s'est pas exécuté après la substitution (djangorestframework == 3.8.2). Et je ne suis pas le seul à faire face à ce problème .

Ma solution consiste simplement à ajouter une valeur par défaut pour le champ sur lequel je souhaite être non requis. Cela était supposé convenir spécifiquement aux situations avec pre_save:

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(default='')
    class Meta:
        model = models.FavoriteList

Vous devez également garder à l'esprit que l'utilisation de sérialiseurs drf avec des signaux pré-enregistrés peut provoquer un comportement implicite (je n'ai pas vérifié, mais cela semble logique):

pre_save est appelé lors de la sauvegarde d'un objet (incroyable), ce qui signifie (probablement) après la validation du sérialiseur.

0
validname