社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

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

Dhanushka Amarakoon • 5 年前 • 1946 次点击  

我需要得到每一个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
 
1946 次点击  
文章 [ 3 ]  |  最新文章 5 年前
Dhanushka Amarakoon
Reply   •   1 楼
Dhanushka Amarakoon    6 年前

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

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    6 年前

你可以用 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    6 年前

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

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

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

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

django.db.connection.queries[-1]

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

str(my_query.query)

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