我们可以使用django orm获得如下所示的输出吗

我们可以使用django orm获得如下所示的输出吗,django,django-orm,django-1.9,Django,Django Orm,Django 1.9,上面是模型,创建时是获取月号的默认字段 我使用了下面的查询来过滤数据,但使用这个查询,我们将不得不再次循环以区分不同月份 [ {'month_number':[1,2,3,4,5]}, {'month_number_2':[6,6,8,8,8,10]} ] class Test(Modelbase): student_id = models.IntegerField(null=True) 我们可以一次性使用Django ORM吗?您可以使用itertools的grou

上面是模型,创建时是获取月号的默认字段

我使用了下面的查询来过滤数据,但使用这个查询,我们将不得不再次循环以区分不同月份

[
    {'month_number':[1,2,3,4,5]},
    {'month_number_2':[6,6,8,8,8,10]}
]

class Test(Modelbase):
    student_id = models.IntegerField(null=True)

我们可以一次性使用Django ORM吗?

您可以使用itertools的
groupby

Model.objects.filter(created_at__month__gte=3).values(*['student_id','created_at'])
从django.db.models导入F,Func
从itertools导入groupby
从运算符导入itemgetter
query=(Model.objects.annotate(month=Func(F('created_at'),function='month'))
.过滤器(月数=3)
.订购人(月)
.values('student_id','month'))
结果={
m:[x['student_id']表示x在xs中]
对于groupby中的m,xs(查询,itemgetter('month'))
}
因此,我们首先生成一个查询,在其中构造一个注释:我们使用
month
属性对每个
Model
实例进行注释,该属性是在
字段处创建的
的月份

接下来,我们根据
month
列大于或等于
3
这一事实进行过滤,接下来我们按照
month
对查询集进行排序(这对于
groupby
函数很重要,该函数仅在项目基于我们想要分组的元素形成分组的情况下才起作用。然后,我们执行
值(…)
以提高查询效率

然后我们执行
groupby(query,itemgetter('month'))
,这样我们就创建了具有相同月份的元素块。这将创建一个包含两个元组的iterable,其中
m
是月数,
xs
是属于该组的字典的iterable


因此,我们将这个iterable转换成一个字典,
m
映射到
student\u id
s的列表中。

对不起,我之前应该提到这个,我使用的是Django 1。9@BharatBittu:语法已更新,可能适用于1.9。感谢您的解释。但是,我收到以下查询响应-
SyntaxError:无效语法('created_at'))筛选器。(month_ugte=3)
@BharatBittu:是的,我打错了。这个问题现在应该解决了,因为这是Django 1.9,因为没有ExtractMonth,所以我们必须使用Extract
from django.db.models import F, Func
from itertools import groupby
from operator import itemgetter

query = (Model.objects.annotate(month=Func(F('created_at'), function='MONTH'))
                      .filter(month__gte=3)
                      .order_by('month')
                      .values('student_id','month'))

result = {
    m: [x['student_id'] for x in xs]
    for m, xs in groupby(query, itemgetter('month'))
}