首页 > 解决方案 > Django ORM按工作日分组并分别总结每个工作日

问题描述

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

这是我的模型:

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

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

标签: djangodjango-modelsdjango-orm

解决方案


在您的查询中,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'
        )

如果您打印出上述查询集的原始查询,您会注意到现在分组没有打开idweekday而是打开了。


推荐阅读