使用 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
我的问题是关于使用 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