我有以下型号:
class Artist(models.Model):
name = models.CharField()
def primary_group(self):
return self.memberships.select_related('group').get(is_primary=True)
class Group(models.Model):
name = models.CharField()
members = models.ManyToManyField(Artist, through='Membership')
class Membership(models.Model):
artist = models.ForeignKey(Artist, related_name='memberships')
group = models.ForeignKey(Group)
is_primary = models.BooleanField()
Artist
并Group
通过中间模型链接,Membership
。艺术家只能有一个主要组,通过is_primary
、已验证等标记。
在我列出艺术家的模板中,除了他们的主要组之外,我还列出了基本的艺术家信息,由上述方法调用。然而,这是一个 O(n) 操作,我有大约 160 位艺术家要这样做。django-debug-toolbar 提供的 SQL 如下:
SELECT ••• FROM "people_membership"
LEFT OUTER JOIN "people_group" ON ("people_membership"."group_id" = "people_group"."id")
WHERE ("people_membership"."artist_id" = xx AND "people_membership"."is_primary" = true )
让我补充一点,这发生在每个列出的艺术家身上,所以我得到了大约 160 个。
考虑到我调用模型方法,O(n) 是可以做到的最好的吗?或者我还能做些什么来改善这一点(没有去规范化primary_group
)?这似乎是存储在我想从源或目标调用的中间模型中的任何类型的信息的问题。