Django查询中的惰性评估如何工作?

时间:2019-04-27 08:51:38

标签: django django-queryset

我对django-querysets中的惰性评估有疑问。

这是我的django查询:

方法1:

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

在这种情况下,我正在使用.values()(轮胎类型)访问外键值。

我使用的另一种方法是:

方法2:

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

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

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

因为我在这两种方法中都使用.values(),所以在这两种情况下查询都只命中一次数据库(由于在方法2中是惰性求值),或者在方法中两次都命中数据库2。

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

2 个答案:

答案 0 :(得分:0)

比这两者更好的方法是首先查询Tires。

var a = listA.ToDictionary(k => k.Id, v => v.Price);
foreach(var item in listB)
{
    item.Price = a.TryGetValue(item.Id, out var newPrice) ? newPrice : item.Price;
}

答案 1 :(得分:0)

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

因此,我决定自己分析查询。

针对 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个查询:

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

query2:'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'