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

Django - One query to get M2M objects

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

我错过了 Reference 有一个指向 Source 的外键。当我在 prefetch_related 中包含 Source 模型时,性能从 8 分钟变为 80 秒(这是可以接受的)。

qs = CVEEntry.objects.prefetch_related('references', 'references__source').all()