Django 1.11.20获取每ISO周和y的行数

2024-10-01 22:28:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要得到每周和每年的物品数量。我试了以下方法

    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}.......

我怎样才能改变它,使我的结果是:

你知道吗

提前谢谢


Tags: djangofromimportdbmodelscount物品year
3条回答

我想出来了,忘了点结果

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}]>

问题不在于缺少的order_by,而很可能恰恰相反:默认的order_by可能通过指定默认排序的ordering字段出现在myModel中,该字段向查询中添加了另一个破坏分组的字段。相关的Django文档是here。你知道吗

您可以通过在查询中附加.order_by()来摆脱它,也可以像在答案中那样指定不同的顺序。你知道吗

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

PS:当事情没有按计划运行时,通过检查上次执行的查询来检查生成的SQL通常是有帮助的:

django.db.connection.queries[-1]

。。。或者通过询问刚刚定义的查询的SQL:

str(my_query.query)

如果您喜欢看到的内容,但不喜欢SQL的格式化方式,请查看sqlparse。你知道吗

您可以使用TruncWeekTruncYear

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}]>

其中weekyear值将是该范围的开始日期时间:一年中的一周

更多细节可以在Django文档here中阅读。你知道吗

相关问题 更多 >

    热门问题