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



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()时再次击中DB,并且性能很糟糕(我有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的外键。当我将Source模型包括在prefetch_related中时,性能从8分钟到80秒(可以接受(。

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

最新更新