【问题标题】:Amount of queries to database in Views using Django使用 Django 在视图中对数据库的查询量
【发布时间】:2021-10-21 11:17:50
【问题描述】:

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

或者有 7 次 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)

任何建议都会很棒。

谢谢!

【问题讨论】:

  • 了解如何记录给定 Django 功能所做的 SQL 查询对您来说很有价值,然后您就会知道这是 7 个查询还是 1 个。如果是 7 个,那么它是真的您确定可以通过 1 个查询解决的性能问题,然后在整个 7 天内发出一个查询,并将结果过滤到代码中的 7 个存储桶中。

标签: python django django-views django-database


【解决方案1】:

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

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得到这个想法,请在官方文档中查看更多关于annotateTruncDate, TruncMonth, TruncYear的信息

【讨论】:

  • 这个好,只要加上缺少的filter(is_reserved=True)
  • 非常感谢!这非常有帮助。
猜你喜欢
  • 2019-03-14
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
相关资源
最近更新 更多