Django - 获取M2M对象的一个​​查询

时间:2018-03-29 16:44:37

标签: django many-to-many prefetch

Entry模型和Reference具有M2M关系。

class Entry(models.Model):
  description = models.TextField(blank=True, null=True)
  references = models.ManyToManyField(Reference, blank=True)

class Reference(models.Model):
  name = models.CharField(max_length=1000, blank=True, null=True)
  title = models.CharField(max_length=1000, blank=True, null=True)

我需要迭代这些条目并从Entry获取一个字段。另外,对于每个entry,我需要迭代其references,并从每个reference获取数据。

prefetch_related未缓存所有参考数据。对于每个entry,当我调用entry.references.all()时,我再次点击数据库,性能非常糟糕(我有100k条目和500k引用)。

如何在一次数据库调用中获取所有数据?

qs = Entry.objects.prefetch_related('references').all()
for entry in qs:
   # do something with entry
   for ref in entry.references.all():
     # do something with ref

1 个答案:

答案 0 :(得分:0)

我错过了ExpiredKeyRemoverReference的外键。当我在Source中加入Source模型时,效果从8分钟变为80秒(这是可以接受的)。

prefetch_related