I持って次のモデル:防止O(N)クエリ
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
、有効化されたものなどのプライマリグループが1つしかありません。
私はアーティストをリストするテンプレートで、上記の方法で呼び出されるプライマリグループに加えて、基本的なアーティスト情報をリストします。しかし、これはO(n)操作であり、これを行うには約160人のアーティストがいます。次のようにジャンゴ・デバッグ・ツールバーが提供する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
)?これは、ソースまたはターゲットのいずれかから呼び出したい中間モデルに格納されている情報の種類に問題があるようです。
これは現在大部分が正しいと確信しています:) –