2011-08-16 54 views
5

我正在嘗試使用South將ForeignKey字段添加到Django模型中。我收到以下錯誤:如何爲Django的ForeignKey字段指定默認值?

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

我沒有,事實上,爲字段指定一個默認值,但我不知道我正確地做到了。

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

應該這樣工作嗎?

回答

7

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) 
+0

我會發布相同。另外,如果Foo沒有數據,則可以在get_foo中創建一個默認元素。 – balazs

+1

是的,使用get_or_create是個好主意! – radious

2

這實在是一個擴展@radious答案的東西。您還可以使用拉姆達在默認情況下,如果你正在尋找削減了,你必須對get_or_create(),因爲該方法返回一個元組使用索引0的代碼行

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

筆記,所以你需要獲取對象,而不是元組。

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

+0

Django無法序列化Lambda表達式 –

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返回元組

相關問題