2013-08-19 26 views
1

我覺得這與previous question有關我問過,但這裏寫着:爲什麼我不能在值調用中使用Django的字段查找?

我正在使用Django的查詢集,並且有一些工作日期。在現在我的代碼我使用的是extra電話,試圖提取一年,從日期的月份:

sum_qs = sum_qs.extra(select={'year': 'EXTRACT(year FROM date)', 'month': 'EXTRACT(month FROM date)','is_paid':'date_paid IS NOT NULL'}) 

sum_qs = sum_qs.values('client__name', 'subtotal_currency', 'is_paid','year', 'month') 

不過,我試圖擺脫這一呼籲的對extra,因爲它似乎考慮到django已經在幾年和幾個月的日期上進行了現場查詢,這有點無用。

所以不是我試圖做到以下幾點:

sum_qs = sum_qs.values('client__name', 'subtotal_currency', 'is_paid','date__year', 'date__month') 

但在這裏我有點離奇的錯誤:

Join on field 'date' not permitted. Did you misspell 'year' for the lookup type? 

首先我不是真的能破譯這個錯誤是什麼應該是這個意思。但是,我真的不可能以這種方式來度過這一年嗎?我主要想這樣做,因爲稍後我annotate我的疑問與總和基於年份和月份的總和。

回答

1

https://docs.djangoproject.com/en/dev/ref/models/querysets/#values

我覺得你還是需要使用額外的查詢。

Field lookups

Field lookups are how you specify the meat of an SQL WHERE clause. They’re specified as keyword arguments to the QuerySet methods filter(), exclude() and get().

的Django會認爲你只是試圖查找一個字段上的關係場「約會」時,使用雙下劃線與你的價值觀查詢。

1

values用於限制SELECT語句,並將值直接映射到db字段名稱。 Django的魔術允許您使用date__year=2000作爲filter()調用不適用於values()

最好的答案真的取決於您的需求/如果您需要查詢集或值..但大多數人使用values()作爲接收少量密鑰的字典映射的快捷方式。

這是一個正常工作的捷徑!如果沒有,請毫不猶豫地找到任何方法使數據正常工作並繼續前進。

[{'date__year': x.date.year, 'foo': 'bar'} for x in sum_qs.values('date', 'foo')] 
相關問題