29

我有 :

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)

我怎样才能拥有一个Alias包含所有内容achiever_setawards预先填充的内容?

>>> 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

我将需要大量访问别名已经获得的奖项(中间表和奖项本身)。我怎样才能批量处理所有这些?

4

2 回答 2

35

Django 版本 1.4 及更高版本已prefetch_related用于此目的。

prefetch_related方法类似于select_related,但不进行数据库连接。相反,它执行额外的数据库查询并在 Python 中进行连接。

于 2012-02-24T13:00:05.020 回答
3

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

于 2012-04-13T00:23:20.170 回答