2011-08-16 14 views
5

estoy tratando de agregar un campo ForeignKey a un modelo de Django usando Sur. Estoy recibiendo el siguiente error:¿Cómo se especifica un valor predeterminado para el campo ForeignKey de Django?

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

lo hice, de hecho, especifique un valor predeterminado para el campo, pero no estoy seguro de que lo hice correctamente.

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

¿Esto funciona?

Respuesta

7

yo sepa Django no ejecutará un QuerySet pasa como un parámetro, incluso si se limita a un elemento. Usted debe intentar algo como propuesta 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

que iba a publicar la misma. Además, puedes crear un elemento predeterminado en get_foo si Foo no tiene datos. – balazs

+1

Sí, usar get_or_create es una buena idea! – radious

2

Esto es realmente una extensión de respuesta @radious. También puede utilizar lambda en el defecto, si usted está buscando para cortar líneas de código

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]) 

en cuenta que debe utilizar el índice 0 en get_or_create() debido a que el método devuelve una tupla, por lo que necesita obtener el objeto, en lugar de la tupla.

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

+0

Django no puede serializar expresiones lambda –

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

tengo creo que es mejor solución que

return Foo.objects.get_or_create(id=1) 

porque tupla retorno get_or_create

Cuestiones relacionadas