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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...