【问题标题】:Django ORM group by week day and sum the day of each separatelyDjango ORM按工作日分组并分别总结每个工作日
【发布时间】:2021-01-12 13:38:04
【问题描述】:

我无法根据工作日进行查询。

这是我的模型:

class Sell(models.Model):
    total_sell = models.IntegerField()
    date = models.DateField(auto_now_add=True)

这是我的查询:

        weekly_sell = Sell.objects.annotate(
            weekday=ExtractWeekDay('date'),
            total=Sum('total_sell')
        ).values(
            'weekday',
            'total'
        )  

但是我得到的数据不是我的预期。

就像我在表格中有一个条目

Sunday sell 4
Sunday sell 7
Friday sell 10

所以我希望它应该返回这些数据:

[
    [
        {
            "weekday": 7,
            "total": 11
        },
        {
            "weekday": 6,
            "total": 0
        },
        {
            "weekday": 5,
            "total": 10
        },
        {
            "weekday": 4,
            "total": 4
        },
        {
            "weekday": 3,
            "total": 0
        },
         {
            "weekday": 2,
            "total": 0
        },
         {
            "weekday": 1,
            "total": 10
        },
    ]
]

但问题是,它没有以我想要的方式返回数据, 它正在返回这些:

[
    [
        {
            "weekday": 7,
            "total": 4
        },
        {
            "weekday": 7,
            "total": 5
        },
         {
            "weekday": 5,
            "total": 10
        },
    ]
]

我不知道这有什么问题。在这种情况下有人可以帮我吗?

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

    在您的查询中,首先在id 上进行分组。您可以通过打印原始查询来确认这一点:print(weekly_sell.query)

    这是因为,当您运行注解时,django 会自动按模型的 id 字段分组。所以你需要添加.values("<<column>>") 要求django ORM 按此列分组而不是id

    您应该使用以下查询:

    
    weekly_sell = Sell.objects.annotate(
                weekday=ExtractWeekDay('date'),
            ).values(
                'weekday',
            ).annotate(
                 total=Sum('total_sell')
            ).values(
                 'weekday',
                 'total'
            )
    

    如果您打印出上述查询集的原始查询,您会注意到现在分组不在id 上,而是在weekday 上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 2010-11-18
      • 2023-04-08
      相关资源
      最近更新 更多