代码之家  ›  专栏  ›  技术社区  ›  Dhanushka Amarakoon

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

  •  0
  • Dhanushka Amarakoon  · 技术社区  · 7 年前

    我需要得到每一个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}.......
    

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

    提前谢谢

    1 回复  |  直到 7 年前
        1
  •  1
  •   Endre Both    7 年前

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

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

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

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

    django.db.connection.queries[-1]
    

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

    str(my_query.query)
    

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

        2
  •  0
  •   Sergey Pugach    7 年前

    你可以用 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 .

        3
  •  0
  •   Dhanushka Amarakoon    7 年前

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

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