如何解决Django:在聚合查询集的模型属性时避免多个查询
我的models.py设置如下:
def garage_test(request,garage_id):
car_list = Car.objects.filter(garage_id = garage_id)
total_currently_serviced = 0
total_currently_available = 0
total_serviced_and_available = 0
total_not_serviced_and_available = 0
for car in car_list:
car_serviced_since_last_hire = car.serviced_since_last_hire
car_currently_available = car.currently_available
if car_serviced_since_last_hire == True:
total_currently_serviced += 1
if car_currently_available == True:
total_currently_available += 1
if car_serviced_since_last_hire == True and car_currently_available == True:
total_serviced_and_available += 1
if car_serviced_since_last_hire == False and car_currently_available == True:
total_not_serviced_and_available += 1
context = {'total_currently_serviced': total_currently_serviced,'total_currently_available': total_currently_available,'total_serviced_and_available': total_serviced_and_available,'total_not_serviced_and_available': total_not_serviced_and_available}
我正在使用模型属性来减少代码重复,因为我在其他地方使用了 current_available 和 serviced_since_last_hire。
My Views.py 尝试计算给定车库的 4 个聚合指标;
- 目前有多少辆车在维修
- 目前雇佣了多少人
- 有多少服务和可用
- 有多少未提供服务但可用
视图.py
car_currently_serviced = car.serviced_since_last_hire
car_currently_available = car.currently_available
虽然这有效,但代码很慢。我一直在使用 Django-Debug-Toolbar,它有助于确定改进的机会(因此在模型属性中使用 .values()、.exists() 和 @cached_property)
问题在于线条
Address
在 for 循环中为每次迭代创建对数据库的查询。虽然这只需要大约 6 毫秒,并且对于一个小车库来说很好,这意味着对于一个有 100,000 辆车的车库,这需要 10 分钟来返回页面请求。 (我意识到这是一个不切实际的大车库,我实际上并不在特斯拉装载设施工作,车库插图是一个玩具示例,我的实际用例虽然在实践中有所不同,但此处更简洁地说明。)
如何缩短获取这些指标的时间?我试图实现 select_related(由于模型属性中的反向外键而无法实现)、prefetch_related(有和没有 Prefetch),但这些方法都没有避免为每辆车对数据库进行两次额外的查询。谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。