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.
.
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']
Si quelqu'un arrive avec un problème similaire, portez une attention particulière aux attributs suivants, ainsi que required
:
Si défini à
True
, la chaîne vide doit être considérée comme une valeur valide.
Normalement, une erreur sera générée si
None
est passé à un champ du sérialiseur.
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
.
Entrée tardive à ce fil. Ce problème a été résolu dans Django-rest-framework 2.3.13 . Voici le lien du PR .
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.