如何为Django ForeignKey字段指定默认值?

时间:2011-08-16 15:09:12

标签: django django-models

我正在尝试使用South向Django模型添加ForeignKey字段。我收到以下错误:

ValueError: You cannot add a null=False column without a default value.
事实上,我确实为字段指定了一个默认值,但我不确定我是否正确。

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

这应该有用吗?

3 个答案:

答案 0 :(得分:8)

AFAIK Django不会执行作为参数传递的QuerySet,即使它仅限于一个元素。你应该尝试类似提议的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)

答案 1 :(得分:2)

这实际上是@radious答案的延伸。如果你想要删除代码行,你也可以在默认情况下使用lambda

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

请注意,您必须在get_or_create()上使用索引0,因为该方法返回一个元组,因此您需要获取对象,而不是元组。

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

答案 2 :(得分:1)

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

我认为这是比

更好的解决方案
return Foo.objects.get_or_create(id=1)

因为get_or_create返回元组