每天过去 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
这是我的模型:
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