Ben Aşağıdaki modeller:önlenmesi O (n) sorgular
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
ve Group
bir ara modeli Membership
ile bağlantılıdır. Sanatçılar sadece is_primary
, onaylanmış vb. Ile işaretlenen bir birincil gruba sahip olabilirler.
Sanatçıları listelediğim bir şablonda, temel sanatçı bilgilerini, yukarıdaki yönteme göre adlandırılan birincil gruplarına ek olarak listeliyorum. Ancak, bu bir O (n) operasyonu ve bunu yapmak için yaklaşık 160 sanatçı var. aşağıdaki gibi django-debug-toolbar sağlayan SQL geçerli:
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)
beni bu listede her sanatçı için olur ekleyelim, bu yüzden bunlardan 160 hakkında olsun.
Model metodunu çağırdığım için O (n) yapılabilecek en iyi şey midir? Ya da bunu geliştirmek için yapabileceğim başka bir şey var mı (primary_group
'u denormalize ediyorsun)? Bu, kaynak veya hedeften aramak istediğim bir aracı modelde saklanan her türlü bilgiyle ilgili bir sorun gibi görünüyor.
Oldukça doğru olduğundan emin olun şimdi budur :) –