models.py :
class DemoA(models.Model):
M = < M2M-Field to DemoB>
class DemoB(models.Model):
title = < CharField >
查询集,具有预提取功能:
qs = DemoA.objects.all().prefetch_related('M')
如docs所述, prefetch_related
与.all()
一起使用时效果很好。
例如:
# This is the expected use case and will not make any additional query
for row in qs:
print(row.M.all())
.values()
或.values_list()
方法访问它怎么办?会进行其他查询吗?例如:
print(qs.values('M'))
# OR
print(qs.values_list('M'))
如果我以类似方式访问M
的属性怎么办?还会进行其他查询吗?
例如:
print(qs.values('M__title'))
如果在这两种情况下都可以进行查询,那么执行相同操作的最佳方法是什么?遍历所有对象并提取其属性是否很好?
答案 0 :(得分:0)
是的。它将进行其他查询。
“预取”查询集属于DemoB模型类。通过row.M.all()
访问时,所使用的查询集属于DemoB模型类,并且查询保持不变。而在print(qs.values('M'))
的情况下,如果是DemoA模型类,则使用查询集,因此构建的查询是不同的。
根据文档:
请记住,与QuerySet一样,任何暗示不同数据库查询的后续链接方法都将忽略先前缓存的结果,并使用新的数据库查询来检索数据。