问题描述
我的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 (将#修改为@)