ForeignKey n'autorise pas les valeurs NULL
Je suis en utilisant le Django REST Framework 2.0.
Voici ma classe de modèle:
class Mission(models.Model):
assigned_to = models.ForeignKey('auth.User',
related_name='missions_assigned',
blank = True)
Voici mon point de vue de classe:
class MissionList(generics.ListCreateAPIView):
model = Mission
serialize_class = MissionSerializer
- Le formulaire multipart est rendu dans le navigateur avec le vide de choix pour
assigned_to
champ. - Lors de la publication des premières JSON, j'obtiens le message d'erreur suivant:
Cannot assign None: "Mission.assigned_to" does not allow null values.
source d'informationauteur Benjamin Toueg
Vous devez vous connecter pour publier un commentaire.
La
blank
option est utilisée dans la validation d'un formulaire, et lenull
est utilisé lors de l'écriture dans la base de données.De sorte que vous pourriez ajouter
null=True
à ce champ.EDIT: continuer le commentaire
En considérant les deux étapes lors de l'enregistrement de l'objet:
blank
)null
)Pour
default
option, prendreIntegerField
par exemple,default=5, blank=True, null=False
pass (1) même si vous n'avez pas affecter une valeur(ayantblank=True
), pass (2) parce qu'il a une valeur par défaut(5) et écrit5
au lieu deNone
DB.blank=True, null=False
qui passe (1), mais pas (2), parce qu'il tente d'écrireNone
DB.Donc, si vous voulez faire un champ optionnel, utilisez
default=SOMETHING, blank=True, null=False
oublank=True, null=True
.Une autre exception est la chaîne-comme le champ, comme
CharField
.Il est suggéré que l'utilisation de la
blank=True
seul, laissantnull=False
derrière.Ce qui fait un champ ou une chaîne de caractères(>=1 chevalier(s)) ou une chaîne vide (" " , len()==0), et de ne jamais
None
.La raison en est que lorsque
null=True
est fixée, il sera possible de la valeur pour l'état "unset": chaîne vide etNone
ce qui est source de confusion(et peut causer des bugs).ForeignKey autorise les valeurs null si ce problème était réglé.
Votre code devrait ressembler à ceci:
Vous devez écrire null=True
Remarque: lorsque vous modifiez un modèle, vous devez exécuter
python manage.py makemigrations yourappname
et puispython manage.py migrate