2011-12-01 61 views
0

我在模型中有一些日期字段,我需要的是將日期範圍中模型中的行數聚合起來。 我有,例如上 - DATE1,DATE2,DATE3,date4,date5 我可以得到行號爲任意範圍:使查詢集具有多個日期範圍

number1 = Model.objects.filter(date__range=(date1, date2)).aggregate(Count('id')) 
number2 = Model.objects.filter(date__range=(date2, date3)).aggregate(Count('id')) 
.... 

然後我需要加入該子號在一個查詢集。 我知道我可以使用:number1 | number2 | ...或itertooks.chain, 但我需要它是查詢集,但不是列表或其他東西。

你會建議我什麼?

附加信息: 感謝您的回覆。 但似乎我並不清楚。 我需要它來得到這樣的東西:2個字段,數據範圍和數字。 似乎不可能使用Q對象在日期間隔內獲取記錄編號。 我管理這個普通的SQL得到它:

sql1 = "Select COUNT(*) as count from table where date_created BETWEEN date1 and date2". 

我用的QuerySet經過加時賽:

qs=qs.extra(select={'number1': sql1, 'number2':sql2 ...}). 

所以我得到了與數字1,數字,...領域和相關值的查詢集。 但我想它是拿到2場:

data_range, number 
range1, number1 
range1, number1 

,並與數據多行。 我想我可以用sql請求使用UNION: sql1 UNION sql2 UNION sql3 .. 似乎這是不可能與Django的ORM,但也許我錯了?

+0

「我需要它是查詢集但不是列表或其他東西」 - 爲什麼? – DrTyrsa

+0

我需要從某些admin.ModelAdmin類的「queryset」方法返回queryset。 – polymetr

+0

也許你可以嘗試使用[Q對象](https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects)和[這種使用註釋的方法] (https://docs.djangoproject.com/en/dev/topics/db/aggregation/#generating-aggregates-for-each-item-in-a-queryset) – gorus

回答

3

使用Q objects

一個快速和骯髒的例子是這樣的:

from django.db.models import Q 

number1 = Model.objects.filter(Q(date__range=(date1, date2) | Q(date__range=(date3, date4)) 

這將返回一個查詢集,其中的日期或者是date1date2date3date4之間或

我也認爲你想要annotate而不是aggregateannotate記錄在here。不過,我對你的問題有點不清楚。

無論哪種方式,基本上,你想要的解決方案是Q對象。

+0

請注意,當您使用OR與'Q'對象,你可能最終會在你的查詢集中出現重複。使用'.distinct()'去除它們。 –

+0

感謝您的回覆。但似乎我還不清楚。 – polymetr