【问题标题】:Django prefetch related and existsDjango预取相关并存在
【发布时间】:2018-11-11 13:25:18
【问题描述】:

我在查询具有多个 m2m 关系的模型时使用prefetch_related

qs = context.mymodel_set.prefetch_related('things1', 'things2', 'things3')

所以当我这样做时不需要执行额外的查询来获取things1,它们应该已经被获取了:

r = list(qs)
r[0].things1.all()

但是如果我使用r[0].things1.exists() 会怎样?这会生成一个新的查询吗?还是会使用预取的信息?如果它生成一个新查询,这是否意味着为存在检查而使用r[0].things1.all() 更有效?

PS:缓存信息与数据库不同步并不让我担心这个特定问题。

【问题讨论】:

    标签: python django django-1.8


    【解决方案1】:

    为自己check the queries that Django is running 很容易。

    当我尝试它时,似乎obj.things.exists() 在预取things 时没有引起任何额外的查询。

    【讨论】:

    • 我正在使用shell_plus --print-sql 进行测试,r[0].things1.all() 似乎正在查询数据库。但是当我做r[0].things1.exists() 时,什么都没有打印出来。
    • 看来我错了 - 当 things 被预取时,exists() 似乎不会引起额外的查询。你的r[0].things.all() 不应该引起任何额外的查询——这就是预取的重点。您还没有显示查询是什么——也许您的 __str__ 方法会导致外键查找。
    猜你喜欢
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2015-12-22
    • 2021-08-15
    相关资源
    最近更新 更多