Est-ce que entry_set doit être mis en cache avec select_related? Ma base de données reçoit toujours des appels même après avoir utilisé select_related. Les sections pertinentesdjango: select_related with entry_set
class Alias(models.Model):
achievements = models.ManyToManyField('Achievement', through='Achiever')
def points(self) :
points = 0
for a in self.achiever_set.all() :
points += a.achievement.points * a.count
return points
class Achievement(models.Model):
name = models.CharField(max_length=100)
points = models.IntegerField(default=1)
class Achiever(models.Model):
achievement = models.ForeignKey(Achievement)
alias = models.ForeignKey(Alias)
count = models.IntegerField(default=1)
aliases = Alias.objects.all().select_related()
for alias in aliases :
print "points : %s" % alias.points()
for a in alias.achiever_set.all()[:5] :
print "%s x %d" % (a.achievement.name, a.count)
Et je vois une grande requête de jointure au début, puis des appels individuels pour chaque réalisation. Tant pour les points et pour la recherche de nom.
Est-ce un bug, ou est-ce que je fais quelque chose de mal?
Bummer. Comment recommanderiez-vous que je fasse cette requête? SQL à la main? –
Pour quiconque lisant, un équivalent 'select_related()' pour M2M et FK inverse est 'prefetch_related()' et a été ajouté en 1.4. – Bryan
googletorp et @Brian, merci beaucoup. – Jamey