Python Django预取相关且存在
查询具有多个m2m关系的模型时,我使用的是Python Django预取相关且存在,python,django,django-1.8,Python,Django,Django 1.8,查询具有多个m2m关系的模型时,我使用的是prefetch\u related: qs = context.mymodel_set.prefetch_related('things1', 'things2', 'things3') 因此,当我这样做时,不需要执行额外的查询来获取内容1,它们应该已经被获取了: r = list(qs) r[0].things1.all() 但是如果我执行r[0]。things1.exists(),该怎么办?这会生成一个新的查询吗?还是会使用预取的信息?如果它生
prefetch\u related
:
qs = context.mymodel_set.prefetch_related('things1', 'things2', 'things3')
因此,当我这样做时,不需要执行额外的查询来获取内容1
,它们应该已经被获取了:
r = list(qs)
r[0].things1.all()
但是如果我执行r[0]。things1.exists()
,该怎么办?这会生成一个新的查询吗?还是会使用预取的信息?如果它生成一个新的查询,这是否意味着为了进行存在性检查而选择r[0].things1.all()
更有效
PS:缓存信息与数据库的去同步不会让我担心这个问题。你自己很容易找到
当我尝试它时,似乎
obj.things.exists()
在预取things
时没有引起任何额外的查询。我正在用shell\u plus--print sql
和r[0]进行测试。things1.all()
似乎正在查询数据库。但是当我执行r[0]时,things1.exists()
没有打印任何内容。看起来我错了-似乎exists()
在预取内容时不会导致额外的查询。您的r[0]。things.all()
不应该引起任何额外的查询-这就是预取的要点。您还没有显示查询是什么——可能是您的\uu str\uu
方法导致了外键查找。