每天过去 7 天的 Django ORM 查询

Django ORM query for last 7 days day by day

这是我的模型:

class Sales(models.Model):
    title = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

我正在尝试获取最近 7 天的数据,比如我想查看上周五、周六、周一等日期发生了多少销售。

仅在最近 7 天出现,但应该会每天出现,

喜欢:

friday: 40
mondey:80
widnesday: 88 etc date

我不知道该怎么做...

我试过如下:

some_day_last_week = timezone.now().date() - timedelta(days=7)    
sales = Sales.objects.filter(
            created_at__gte=some_day_last_week,
        ).values(
            'created_at__date'
        ).annotate(
            created_count=Count('created_at__date')
        )

谁能帮我解决这个问题?

您需要在您的案例中使用 TruncDay:

from django.db.models.functions import TruncDay

sales = Sales.objects.filter(
            created_at__gte=some_day_last_week,
        ).annotate(
            day=TruncDay('created_at')
            created_count=Count('created_at__date')
        ).values(
            'day',
            'created_count',
        )

结果你会得到:

[
    {'day': datetime.date(2019, 12, 1), 'created_count': 4.0}, 
    {'day': datetime.date(2019, 12, 2), 'created_count': 10.0},
    {'day': datetime.date(2019, 12, 3), 'created_count': 5.0},
    {'day': datetime.date(2019, 12, 4), 'created_count': 1.0},
    {'day': datetime.date(2019, 12, 5), 'created_count': 8.0},
    {'day': datetime.date(2019, 12, 6), 'created_count': 4.0},
]

为了获得日期名称,您可以使用 date.strftime("%A"):

转换日期时间对象
for i in result:
    print(i['day'].strftime("%A"))

# result 
Sunday
Monday
...
Friday