2011-12-07 64 views
0

我想在包含日期的相關模型中的查詢集中包含月份編號。這是我的嘗試:如何在django查詢集中獲取日期的月份

OrderItem.objects.all().annotate(order_month=Sum('order__payment_date__month'))[0].__dict__ 

Join on field 'payment_date' not permitted. Did you misspell 'month' for the lookup type? 

,然後我試圖

OrderItem.objects.all().extra(select={'order_month': "order__payment_date__month"}) 

(1054, "Unknown column 'order__payment_date__month' in 'field list'") 

OrderItem.objects.all().extra(select={'order_month': "order.payment_date"}).select_related('Order') 

(1054, "Unknown column 'order.payment_date' in 'field list'") 

但這工作所以沒問題order.payment_date

OrderItem.objects.all().values('id','order__payment_date').select_related('Order') 

我需要它在querset結果作爲我使用Geraldo中的查詢集。任何人都知道我可以如何得到這個?

答案是在額外部分中,您需要指定您想要的內容,以便MySQL瞭解它。在我的情況下,在模型名稱前添加應用程序。在這種情況下,web_order.payment_date。這工作:

OrderItem.objects.all().extra(select={'order_month': "MONTH(web_order.payment_date)"}).select_related('order')[0].__dict__ 

{'product_id': None, 'order_id': 1L, 'price': Decimal("1.00"), 'order_month': 7L, 'id': 1L} 
+0

爲什麼你在這裏做一個總和? OrderItem.objects.all()。annotate(order_month = Sum('order__payment_date__month'))[0] .__ dict__ –

+0

什麼是「付款月數」甚至應該是什麼意思? –

+0

由於月是一個整數,我認爲我可以很聰明,並使用註釋來添加此字段。可悲的不是! – PhoebeB

回答

1

你需要向下拖放到SQL來完成這件事,這意味着黯然解決方案將不會是數據庫無關。

此作品在Postgres的:

# Grab the base queryset 
items = Item.objects.all() 

# Annotate 
extra_query = "EXTRACT(MONTH FROM relatedtable.mydatefield)" 
items = items.extra(select={'mydatefield_month': extra_query} 

# We have to use a select_related so that 'relatedtable' is 
# available in the SQL statement. 
items = items.select_related('relatedmodel') 

print items[0].mydatefield_month 

對於MySQL,你可以嘗試:

extra_query = "MONTH(relatedtable.mydatefield)" 
+0

嗯 - 沒有得到它的工作。請參閱編輯原始問題。 – PhoebeB

+0

嘗試更改select_related('訂單')select_related('訂單') –

+0

這並沒有解決它,但你把我放在正確的道路上!已經在工作查詢的問題,我給你信貸。謝謝。 – PhoebeB

1

在Django中1.10+,您可以使用ExtractMonth功能。

from django.db.models.functions import ExtractMonth 
OrderItem.objects.all().annotate(order_month=ExtractMonth('order__payment_date')) 
相關問題