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

10 投票
4 回答
7572 浏览
提问于 2025-04-16 23:42

我正在尝试在Django模型中添加一个ForeignKey字段,使用的是South这个工具。结果我遇到了一个错误:

ValueError: 你不能添加一个不允许为空(null=False)的字段而没有默认值。

其实我确实给这个字段指定了一个默认值,但我不太确定我是不是指定对了。

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

这样做应该没问题吧?

4 个回答

1

这其实是对@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

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

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

比这个更好

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

据我所知,Django 不会执行作为参数传入的 QuerySet,即使它只限制为一个元素。你可以尝试一下这个帖子中提到的方法 在这里

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)

撰写回答