Ho i seguenti modelli:Prevenzione O (n) Le query con i modelli di intermediazione
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
e Group
sono collegati tramite un modello di intermediazione, Membership
. Gli artisti possono avere solo un gruppo principale, che è contrassegnato tramite
In un modello in cui elenco gli artisti, elenco le informazioni di base sull'artista in aggiunta al loro gruppo principale, richiamato dal metodo precedente. Tuttavia, questa è un'operazione O (n) e ho circa 160 artisti a cui fare questo. Lo SQL che il Django-debug-barra degli strumenti offre è la seguente:
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)
Lasciatemi aggiungere che questo accade per ogni artista elencati, così ottengo circa 160 di questi.
È O (n) il meglio che si può fare, visto che chiamo un metodo modello? O c'è qualcos'altro che posso fare per migliorare questo (a corto di denormalizzare primary_group
)? Questo sembra essere un problema con qualsiasi tipo di informazione che è memorizzata in un modello intermedio che vorrei chiamare dalla fonte o dalla destinazione.
Abbastanza sicuro che questo è per lo più corretto ora :) –