Py学习  »  Django

Django 1.11.20获取每个ISO周和年的行数

Dhanushka Amarakoon • 4 年前 • 869 次点击  

我需要得到每一个ISO周和年的项目数。我试了一下

    from django.db.models.functions import ExtractWeek, ExtractYear
    from django.db.models.aggregates import Count

    count = myModel.objects.annotate(year=ExtractYear('created_at')) \
        .annotate(week=ExtractWeek('created_at')) \
        .values('year','week') \
        .annotate(count=Count('week'))

但我的结果是

<QuerySet [{'year': 2019, 'week': 7, 'count': 1}, {'year': 2019, 'week': 7, 'count': 1}, {'year': 2019, 'week': 7, 'count': 1}, {'year': 2019, 'week': 7, 'count': 1}.......

我如何才能改变它,使我的结果是:

提前谢谢

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/52842
 
869 次点击  
文章 [ 3 ]  |  最新文章 4 年前
Dhanushka Amarakoon
Reply   •   1 楼
Dhanushka Amarakoon    5 年前

我想起来了,我忘了点菜了

from django.db.models.functions import ExtractWeek, ExtractYear
from django.db.models.aggregates import Count

count = myModel.objects.annotate(year=ExtractYear('created_at')) \
    .annotate(week=ExtractWeek('created_at')) \
    .values('year','week') \
    .annotate(count=Count('id')).order_by('count')

<QuerySet [{'year': 2019, 'week': 7, 'count': 8}]>
Sergey Pugach
Reply   •   2 楼
Sergey Pugach    5 年前

你可以用 TruncWeek TruncYear :

from django.db.models.functions import TruncWeek, TruncYear

count_for_week = myModel.objects.annotate(
    week=TruncWeek('created_at'),
).values(
    'week',
).annotate(
    count=Count('id'),
)

count_for_year = myModel.objects.annotate(
    year=TruncYear('created_at'),
).values(
    'year',
).annotate(
    count=Count('id'),
)

因此,您将拥有:

 <QuerySet [{'week': datetime.datetime(2019, 2, 18, 0, 0, tzinfo=<UTC>), 'count': 1}]>

在哪里? week year 值将是该范围的开始日期时间:一年中的一周

你可以在Django文档中阅读更多细节 here .

Endre Both
Reply   •   3 楼
Endre Both    5 年前

问题不是失踪 order_by 但可能恰恰相反:违约 订货人 可能出现在 myModel 通过 ordering 指定默认排序的字段,该字段将另一个字段添加到破坏分组的查询中。相关的Django医生是 here .

你可以通过附加 .order_by() 或者您可以像在回答中那样指定不同的顺序。

这是一个让人一次又一次(包括我自己)的障碍,所以我不喜欢在模型中使用默认排序。

注意:当事情没有按计划运行时,通过检查最后执行的查询来检查生成的SQL通常会有帮助:

django.db.connection.queries[-1]

... 或者通过请求刚刚定义的查询的SQL:

str(my_query.query)

如果您喜欢看到的内容,但不喜欢SQL的格式化方式,请查看 sqlparse .