2011-08-16 8 views
5

Sto tentando di aggiungere un campo ForeignKey a un modello Django utilizzando South. Sto ottenendo il seguente errore:Come si specifica un valore predefinito per il campo Django ForeignKey?

ValueError: You cannot add a null=False column without a default value. 

ho fatto, infatti, specificare un valore predefinito per il campo, ma non sono sicuro di aver fatto correttamente.

language = models.ForeignKey(Language, default=Language.objects.all()[0]) 

Questo lavoro dovrebbe funzionare?

risposta

7

AFAIK Django non eseguirà un QuerySet passato come parametro, anche se è limitato a un elemento. Si dovrebbe provare qualcosa di simile proposto in this post

class Foo(models.Model): 
    a = models.CharField(max_length=10) 

def get_foo(): 
    return Foo.objects.get_or_create(id=1) 

class Bar(models.Model): 
    b = models.CharField(max_length=10) 
    a = models.ForeignKey(Foo, default=get_foo) 
+0

vorrei pubblicare lo stesso. Inoltre è possibile creare un elemento predefinito in get_foo se Foo non ha dati. – balazs

+1

Sì, usare get_or_create è una buona idea! – radious

2

Questa è davvero un'estensione alla risposta @radious. È inoltre possibile utilizzare lambda in difetto, se stai cercando di tagliare fuori le righe di codice

class Foo(models.Model): 
    a = models.CharField(max_length=10) 

class Bar(models.Model): 
    b = models.CharField(max_length=10) 
    a = models.ForeignKey(Foo, default=lambda: Foo.objects.get_or_create(id=1)[0]) 

noti che è necessario utilizzare l'indice 0 su get_or_create(), in quanto il metodo restituisce una tupla, quindi è necessario prendi l'oggetto, invece della tupla.

https://docs.djangoproject.com/en/1.6/ref/models/querysets/#get-or-create

+0

Django non può serializzare espressioni lambda –

1
def get_default(): 
    result, _ = Foo.objects.get_or_create(id=1) 
    return result 

ho credo che sia una soluzione migliore rispetto

return Foo.objects.get_or_create(id=1) 

perché ritorno get_or_create tuple

Problemi correlati