Django是否通过“ values()”或“ values_list()”访问预取的M2M字段进行其他查询?

时间:2019-05-23 19:19:58

标签: python django python-3.x django-2.0

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())

1)现在,如果我尝试使用.values().values_list()方法访问它怎么办?会进行其他查询吗?

例如:

print(qs.values('M'))

# OR

print(qs.values_list('M'))

2)附加:

如果我以类似方式访问M的属性怎么办?还会进行其他查询吗?

例如:

print(qs.values('M__title'))

如果在这两种情况下都可以进行查询,那么执行相同操作的最佳方法是什么?遍历所有对象并提取其属性是否很好?

1 个答案:

答案 0 :(得分:0)

是的。它将进行其他查询。

原因:

“预取”查询集属于DemoB模型类。通过row.M.all()访问时,所使用的查询集属于DemoB模型类,并且查询保持不变。而在print(qs.values('M'))的情况下,如果是DemoA模型类,则使用查询集,因此构建的查询是不同的。

根据文档:

  

请记住,与QuerySet一样,任何暗示不同数据库查询的后续链接方法都将忽略先前缓存的结果,并使用新的数据库查询来检索数据。