2014-05-23 129 views
1

我想使用Django的額外()方法來添加一個外鍵字段到查詢集,但我得到數據庫錯誤。我想知道我做錯了什麼。這是我的設置:在django模型上使用額外的()外鍵失敗,數據庫錯誤

class ModelA(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    name = models.CharField(max_length=100) 

class ModelB(models.Model): 
    name = models.CharField(max_length=100) 
    rel = models.ForeignKey(ModelA) 

我想用額外的()從相關模型添加一個字段,所以我可以用它註釋()。 這裏就是我想要做的事:

ModelB.objects.all().extra(select={'date' : 'date(rel.created)'}).values('date').annotate(...) 

這給了我一個DB的錯誤,他說,列「相對」不存在。

我正在使用PostgreSQL。 任何人都可以幫我弄清楚我做錯了什麼?

回答

0

那麼,它不存在:另一個表被稱爲model_a

但是沒有理由在這裏使用extra。您可以通過電話values得到該列:

ModelB.objects.all().values('rel__created')... 
+0

感謝您的回答。雖然你是正確的,我不需要額外的()來獲取信息,但我試圖用它來將日期時間字段格式化爲僅限日期(使用數據庫的date()函數),以便我執行註釋()。如果我不使用它,我在你的查詢集中得到的每個值在時間戳上稍有不同,因此annotate()中的count方法不會給我想要的結果 – elynch

3

當使用extra()你明確編寫SQL代碼。在後端,rel實際上保存爲rel_id,每行都是ModelA的pk - 這就是爲什麼你會得到列「rel」不存在

您需要在正確的SQL重寫你extra(select={})

ModelB.objects.all().extra(
    select={'date': '''SELECT created 
         FROM appname_modela 
         WHERE appname_modela.id = appname_modelb.rel_id'''}) 

然而,隨着@Daniel羅斯曼說,你的問題其實並不需要使用extra()可言的,我會強烈建議反對在這種情況下。