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