【问题标题】:How lazy evaluation in django query works?django 查询中的惰性求值如何工作?
【发布时间】:2019-09-16 15:07:36
【问题描述】:

我对 django-querysets 中的惰性求值存有疑问。

这是我的 django 查询:

方法一:

tyres_in_car = Car.objects.filter(serial_no__startswith('AB')).values('tyre__type')

在这个查询中,我使用.values()(轮胎类型)访问外键值。

我使用的另一种方法是:

方法二:

第一行:tyres = Car.objects.filter(serial_no__startswith('AB'))

第二行:all_tyres = tyres.tyre.all()

第 3 行:tyres_in_car = [ ty.type for ty in all_tyres ]

因为,我在这两种方法中都使用了.values(),所以在这两种情况下,查询是否只命中数据库一次(因为方法 2 的延迟评估)或者在方法 2 的情况下它命中两次。

从代码可读性的角度来看,我认为方法2看起来更合适。

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    在对各种帖子进行了一段时间的研究后,我显然无法找到任何解决方案。

    所以,我决定自己分析查询。

    Method1 生成的查询是单个查询:

    SELECT "I_tyre"."type" FROM "I_car" LEFT OUTER JOIN "I_car_tyre" ON ("I_car"."id" = "I_car_tyre"."car_id") LEFT OUTER JOIN "I_tyre" ON ("I_car_tyre"."tyre_id" = "I_tyre"."id") WHERE "I_car"."id" = 1 LIMIT 21', 'time': '0.000'

    Method2 有 2 个查询:

    查询1:'SELECT "I_car"."id", "I_car"."serial_no" FROM "I_car" WHERE "I_car"."id" = 1'

    查询2:'SELECT "I_tyre"."id", "I_tyre"."type" FROM "I_tyre" INNER JOIN "I_car_tyre" ON ("I_tyre"."id" = "I_car_tyre"."tyre_id") WHERE "I_car_tyre"."car_id" = 1'

    【讨论】:

      【解决方案2】:

      比两者更好的方法是首先查询轮胎。

      Tyre.objects.filter(car__serial_no__startswith='AB').values('type')
      

      【讨论】:

      • 是的!但请考虑我是否还需要从汽车表中获取值。
      猜你喜欢
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 2011-02-23
      相关资源
      最近更新 更多