我对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更合适。
答案 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'