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()