Django 使用多个日期范围进行查询集

Django 使用多个日期范围进行查询集,django,Django,我在模型中有一些日期字段,我需要的是按日期范围聚合模型中的行数。 例如,我有日期1、日期2、日期3、日期4、日期5 我可以获得任何范围的行号: number1 = Model.objects.filter(date__range=(date1, date2)).aggregate(Count('id')) number2 = Model.objects.filter(date__range=(date2, date3)).aggregate(Count('id')) .... 然后我需要在一个

我在模型中有一些日期字段,我需要的是按日期范围聚合模型中的行数。 例如,我有日期1、日期2、日期3、日期4、日期5 我可以获得任何范围的行号:

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 extra后:

qs=qs.extra(select={'number1': sql1, 'number2':sql2 ...}).
所以我有一个1号,2号的查询集,。。字段和相关值。 但我想要的是得到2个字段:

data_range, number
range1, number1
range1, number1
并且有许多包含数据的行。 我想我可以使用UNION通过sql请求获得它: sql1联合sql2联合sql3。。 Django ORM似乎不可能,但也许我错了

使用:

下面是一个简单的例子:

from django.db.models import Q

number1 = Model.objects.filter(Q(date__range=(date1, date2) | Q(date__range=(date3, date4))
这将返回一个查询集,其中日期介于
date1
date2
之间,或者介于
date3
date4
之间

我还认为您需要
注释
,而不是
聚合
<代码>注释已记录在案。不过,从你的问题来看,我有点不清楚

无论哪种方式,基本上,您想要的解决方案是
Q
对象。

使用:

下面是一个简单的例子:

from django.db.models import Q

number1 = Model.objects.filter(Q(date__range=(date1, date2) | Q(date__range=(date3, date4))
这将返回一个查询集,其中日期介于
date1
date2
之间,或者介于
date3
date4
之间

我还认为您需要
注释
,而不是
聚合
<代码>注释已记录在案。不过,从你的问题来看,我有点不清楚


无论哪种方式,从根本上说,您想要的解决方案是
Q
对象。

“我需要的是查询集,而不是列表或其他东西”-为什么?我需要从某个admin.ModelAdmin类的'queryset'方法返回查询集。也许您可以尝试使用并尝试使用
Q(start\u date\u gte==date1)和(Q(end\u date\u lte==date2))
“我需要的是queryset,但不是list或其他东西”-为什么?我需要从某个admin.ModelAdmin类的'queryset'方法返回queryset。也许您可以尝试使用类似于
Q(start\u date\u gte==date1)和(Q(end\u date\u lte==date2))
的对象使用or时,请注意,在查询集中很可能会出现重复项。使用
.distinct()
删除它们。感谢您的回复。但我似乎还不够清楚。请注意,当您将ORs与
Q
对象一起使用时,您的查询集中可能会出现重复的ORs。使用
.distinct()
删除它们。感谢您的回复。但我似乎还不够清楚。