使用 Django 在视图中对数据库的查询量

Amount of queries to database in Views using Django

我的问题是关于使用 Django 在视图中查询数据库的最佳实践。

我想要过去 7 天的每日预订数量。有这样的东西可以吗? (下)

count_day_1 = len(Reservations.objects.filter(date=TODAY_DATE).filter(is_reserved=True))
count_day_2 = len(Reservations.objects.filter(date=DATE_TODAY_MINUS_1).filter(is_reserved=True))
count_day_3 = len(Reservations.objects.filter(date=DATE_TODAY_MINUS_2).filter(is_reserved=True))
count_day_4 = len(Reservations.objects.filter(date=DATE_TODAY_MINUS_3).filter(is_reserved=True))
count_day_5 = len(Reservations.objects.filter(date=DATE_TODAY_MINUS_4).filter(is_reserved=True))
count_day_6 = len(Reservations.objects.filter(date=DATE_TODAY_MINUS_5).filter(is_reserved=True))
count_day_7 = len(Reservations.objects.filter(date=DATE_TODAY_MINUS_6).filter(is_reserved=True))

或者 Reservations.objects.filter() 里面有 7 次 ping 数据库 7 次吗?

如果不推荐上述方式,我应该设置成这样吗? (下)

data = Reservations.objects.filter(is_reserved=True)

for item in data:
    if item.date == TODAY_DATE:
        print(item.date)
    if item.date == DATE_TODAY_MINUS_1:
        print(item.date)

(...so on and so forth)

任何建议都很好。

谢谢!

首先我们会得到7天前日期的datetime对象

from datetime import datetime, timedelta
previous_date = datetime.now() - timedelta(days=7) 

然后我们将使用 TruncDate 并按日期

获取计数
from django.db.models.functions import TruncDate  
from django.db.models import Count   
data = Reservations.objects.filter(date__gte=previous_date, is_reserved=True)\
.annotate(day=TruncDate('date'))\
.values('day').annotate(count=Count('id'))\
.values('day', 'count')

这会给你这样的结果

<QuerySet [{'day': datetime.date(2021, 8, 10), 'count': 5}, 
{'day': datetime.date(2021, 8, 11), 'count': 4}, 
{'day': datetime.date(2021, 8, 12), 'count': 4}, 
{'day': datetime.date(2021, 8, 13), 'count': 6}]>

灵感来自 this answer please see more in the official documentation about annotate, TruncDate, TruncMonth, TruncYear