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_setawards预填充的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中的连接。

如果你不在Django 1.4上,还有django-batch-select库,它的工作原理与prefetch_related基本相同。