仅限django prefetch_related id

dem*_*mux 15 django django-models django-queryset

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

查询

您可以忽略第4个查询.这与问题无关.

相关代码:

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

queryset = Contact.objects.all().prefetch_related('Groups')
Run Code Online (Sandbox Code Playgroud)

Fre*_*Dug 23

Django 1.7添加了Prefetch对象,可以自定义预取时使用的查询集.在这种情况下,你需要这样的东西:

queryset = Contact.objects.all().prefetch_related(
    Prefetch('Groups', queryset=Group.objects.all().only('id')))
Run Code Online (Sandbox Code Playgroud)

  • 在带有Postgres的Django 1.11中,我需要另外选择预取对象的外键 - 否则Django正在为每个预取对象执行数据库查找以选择外键(这比根本没有预取更差).在这个例子中,修改将是:`queryset = Group.objects.all().only('id','contact_id'))` (5认同)
  • 对于那些寻找相应导入的人:`from django.db.models import Prefetch` (3认同)