2013-05-16 15 views
13

Sto utilizzando il Django REST Framework 2.0.ForeignKey non consente valori nulli

Qui è la mia classe del modello:

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

Qui è la mia classe di visualizzazione:

class MissionList(generics.ListCreateAPIView): 
    model = Mission 
    serialize_class = MissionSerializer 
  1. Il modulo multipart è visualizzato nel browser con scelta vuoto per assigned_to campo.

  2. Quando postate JSON cruda, ricevo il seguente messaggio di errore:

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

risposta

46

L'opzione blank viene utilizzato nella validazione dei form, e il null viene utilizzata durante la scrittura nel database.

Quindi è possibile aggiungere null=True a tale campo.

EDIT: continuare il commento

Considerando le due fasi durante il salvataggio oggetto:

  1. validatore (controllato da blank)
  2. limitazione Database (controllato da null)

Per l'opzione default, prendere IntegerField ad esempio,
default=5, blank=True, null=False, passare (1) anche se non è stato assegnato un valore (con blank=True), passare (2) perché ha un valore predefinito (5) e scrive 5 anziché None in DB.
blank=True, null=False, che passano (1) ma non (2), perché tenta di scrivere None in DB.

Pertanto, se si desidera rendere facoltativo un campo, utilizzare default=SOMETHING, blank=True, null=False o blank=True, null=True.

Un'altra eccezione è il campo tipo stringa, ad esempio CharField.
Si consiglia di utilizzare lo blank=Trueda solo, lasciando null=False indietro.
Questo rende un campo una stringa (> = 1 carattere (i)) o una stringa vuota ('', con len() == 0), e mai None.

Il motivo è che quando è impostato null=True, ci saranno due possibili valori per lo stato "unset": stringa vuota e None, che confonde (e potrebbe causare errori).

+0

Il che significa 'vuoto = True 'deve sempre essere usato con' null = True'? Perché non posso scegliere vuoto nella mia forma? Ho usato 'blank = True'. –

+1

'assigned_to == None' ha passato il validatore del modulo, ma non il database. Senza 'null = True', non è possibile scrivere' Nessuno' nel database. Quindi, in generale, se si desidera un campo facoltativo, impostare sia 'blank' che' null' su 'True'. – user1034937

+2

Tuttavia, ci sono due eccezioni, l'opzione 'default' e campi tipo stringa. (Vorrei aggiungere dopo il post, invece di qui, il commento.) – user1034937

0

ForeignKey consente valori null se questo comportamento è stato impostato. Il codice sarà simile a questa:

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

Devi scrivere nulla = True Nota: dopo aver modificato un modello, è necessario eseguire python manage.py makemigrations yourappname e poi python manage.py migrate