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

2izufjch  于 2023-05-12  发布在  Python
关注(0)|答案(4)|浏览(153)

我正在尝试使用South向Django模型添加一个ForeignKey字段。我得到以下错误:
ValueError:不能添加没有默认值的null=False列。
事实上,我确实为该字段指定了一个默认值,但我不确定是否正确。

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

这应该工作吗?

brccelvz

brccelvz1#

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

x9ybnkn62#

因为get_or_create返回一个元组,我认为这是一个更好的解决方案

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

比这个

return Foo.objects.get_or_create(id=1)
xuo3flqw

xuo3flqw3#

这其实是@radious answer的延伸。如果您希望减少代码行,也可以在默认情况下使用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

y0u0uwnf

y0u0uwnf4#

应该使用get_or_create()和models。ForeignKey()需要on_delete,如下所示。* 不要忘记将.id放在get_or_create(id=1)[0]之后,因为models.ForeignKey()中的默认值需要Language对象的id,否则会出现错误:

language = models.ForeignKey(
    Language,               # Here  
    default=Language.objects.get_or_create(id=1)[0].id),
    on_delete=models.CASCADE # Here
)

相关问题