私は次のモデルを持っています:
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
ます。アーティストは、1つのプライマリグループのみを持つことができます。これは、を介してマークされ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
)?これは、ソースまたはターゲットのいずれかから呼び出したい中間モデルに格納されているあらゆる種類の情報に問題があるようです。