2013-05-16 8 views
13

Ich verwende das Django REST Framework 2.0.ForeignKey erlaubt keine Nullwerte

Hier ist meine Modellklasse:

class Mission(models.Model): 
    assigned_to = models.ForeignKey('auth.User', 
            related_name='missions_assigned', 
            blank = True) 

Hier ist meine Ansicht Klasse:

class MissionList(generics.ListCreateAPIView): 
    model = Mission 
    serialize_class = MissionSerializer 
  1. Die mehrteilige Form wird für assigned_to Feld im Browser mit leerer Wahl gemacht.

  2. Wenn JSON veröffentlichen, erhalte ich die folgende Fehlermeldung:

Cannot assign None: "Mission.assigned_to" does not allow null values.

Antwort

46

Die blank Option wird in der Formularvalidierung verwendet, und die null verwendet wird, wenn auf die Datenbank zu schreiben.

Sie könnten also null=True zu diesem Feld hinzufügen.

EDIT: weiterhin den Kommentar

Betrachtet man die beiden Schritte, wenn das Objekt zu speichern:

  1. Validator (gesteuert durch blank)
  2. Datenbank Begrenzung (gesteuert durch null)

Für default Option, nehmen Sie IntegerField zum Beispiel
default=5, blank=True, null=False, übergeben Sie (1), auch wenn Sie keinen Wert zugewiesen haben (blank=True), übergeben Sie (2), weil es einen Standardwert (5) hat und 5 statt None an DB schreibt.
blank=True, null=False, die (1) aber nicht (2) bestehen, weil sie versucht, None an DB zu schreiben. Wenn Sie ein Feld optional machen möchten, verwenden Sie entweder default=SOMETHING, blank=True, null=False oder blank=True, null=True.

Eine weitere Ausnahme ist das string-ähnliche Feld, z. B. CharField.
Es wird empfohlen, die blank=Trueallein zu verwenden und null=False hinter sich zu lassen.
Dies macht ein Feld entweder eine Zeichenfolge (> = 1 Zeichen) oder eine leere Zeichenfolge ('', mit len ​​() == 0) und niemals None.

Der Grund ist, dass, wenn null=True gesetzt ist, gibt es zwei mögliche Werte für den Zustand "unset": leere Zeichenfolge und None, die verwirrend ist (und Bugs verursachen könnte).

+0

Was bedeutet 'blank = True 'muss immer mit' null = True' verwendet werden? Warum kann ich in meinem Formular nicht leer wählen? Ich habe 'blank = True' verwendet. –

+1

'assigned_to == None' hat den Formularvalidierer, aber keine Datenbank übergeben. Ohne 'null = True' können Sie 'None' nicht in die Datenbank schreiben. Wenn Sie also ein optionales Feld wünschen, setzen Sie sowohl 'blank' als auch' null' auf 'True'. – user1034937

+2

Es gibt jedoch zwei Ausnahmen, "default" -Option und string-ähnliche Felder. (Ich möchte nach dem Post, anstatt hier, den Kommentar hinzufügen.) – user1034937

0

ForeignKey erlaubt Nullwerte, wenn dieses Verhalten festgelegt wurde. Ihr Code wird wie folgt aussehen:

class Mission(models.Model): 
    assigned_to = models.ForeignKey('auth.User', related_name='missions_assigned',blank = True,null=True) 

Sie haben null schreiben = True Hinweis: nachdem Sie ein Modell ändern, müssen Sie python manage.py makemigrations yourappname laufen und dann python manage.py migrate