Django的:select_related与ManyToManyField
问题描述:
我:Django的:select_related与ManyToManyField
class Award(models.Model) :
name = models.CharField(max_length=100, db_index=True)
class Alias(models.Model) :
awards = models.ManyToManyField('Award', through='Achiever')
class Achiever(models.Model):
award = models.ForeignKey(Award)
alias = models.ForeignKey(Alias)
count = models.IntegerField(default=1)
我怎么能有已所有achiever_set
和awards
预填充的Alias
?
>>> db.reset_queries()
>>> Alias.objects.filter(id="450867").select_related("achiever_set__award").get().achiever_set.all()[0].award.name
u'Perma-Peddle'
>>> len(db.connection.queries)
3
>>> db.reset_queries()
>>> Alias.objects.filter(id="450867").select_related("awards").get().awards.all()[0].name
u'Dwarfageddon (10 player)'
>>> len(db.connection.queries)
2
我需要很多获得别名已经获得的奖励(中间表和奖励本身)。我如何批量所有这些?
答
为此,Django 1.4及以上版本有prefetch_related
。
prefetch_related
方法类似于select_related
,但不做数据库连接。相反,它会执行额外的数据库查询并执行Python中的连接。