I mają następujące modele:Zapobieganie O (N) przesyła intermedyacijne modeli
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
i Group
są połączone za pośrednictwem pośredniego, Membership
modelu. Artyści mogą mieć tylko jedną grupę podstawową, która jest oznaczona przez is_primary
, zatwierdzona itp.
W szablonie, w którym wymieniam wykonawców, wyświetlam podstawowe informacje o wykonawcy oprócz ich grupy podstawowej, wywoływane za pomocą powyższej metody. Jest to jednak operacja O (n) i mam do tego około 160 artystów. SQL że django-debug-pasek narzędzi zapewnia się następująco:
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)
Dodam, że to się dzieje dla każdego artysty wymienione, więc dostać około 160 z nich.
Czy O (n) najlepiej można zrobić, biorąc pod uwagę, że nazywam metodę modelową? Czy jest coś jeszcze, co mogę zrobić, aby to poprawić (brak denormalizacji primary_group
)? Wydaje się, że jest to problem z jakimikolwiek informacjami przechowywanymi w pośredniczącym modelu, które chciałbym wywołać ze źródła lub celu.
Jestem pewien, że obecnie jest to w większości poprawne :) –