【问题标题】:django prefetch_related id only仅 django prefetch_related id
【发布时间】:2013-09-26 22:17:36
【问题描述】:

我正在尝试优化我的查询,但 prefetch_related 坚持加入表并选择所有字段,即使我只需要关系表中的 id 列表。

您可以忽略第四个查询。与题目无关。

相关代码:

class Contact(models.Model):
    ...
    Groups = models.ManyToManyField(ContactGroup, related_name='contacts')
    ...

queryset = Contact.objects.all().prefetch_related('Groups')

【问题讨论】:

    标签: django django-models django-queryset


    【解决方案1】:

    Django 1.7 添加了Prefetch objects,它允许您自定义预取时使用的查询集。在这种情况下,您需要类似:

    queryset = Contact.objects.all().prefetch_related(
        Prefetch('Groups', queryset=Group.objects.all().only('id')))
    

    【讨论】:

    • 在带有 Postgres 的 Django 1.11 中,我需要额外选择预取对象的外键——否则 Django 会为每个预取对象进行数据库查找以选择外键(这比没有完全预取)。在本例中,修改为:queryset=Group.objects.all().only('id', 'contact_id'))
    • @erikreed 谢谢,我来这里是为了确认!
    • @erikeed 我使用的是 Django 3.1,我不需要选择外键。事实上,包含外键大约会使评估查询所需的时间增加一倍(当然取决于您的表结构:))
    猜你喜欢
    • 1970-01-01
    • 2012-10-07
    • 2016-08-15
    • 1970-01-01
    • 2016-11-28
    • 2014-09-01
    • 2019-08-07
    • 2018-12-15
    • 1970-01-01
    相关资源
    最近更新 更多