我可以在Django模型中对ManyToManyField使用select_related()吗?
我有:
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_set
和 awards
预先填充好呢?
>>> 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
我需要大量访问一个别名已经获得的奖项(包括中间表和奖项本身)。我该如何批量处理这些呢?
2 个回答
3
如果你还没用到Django 1.4版本,可以试试这个叫做 django-batch-select 的库,它的工作原理和prefetch_related差不多。
46
Django 1.4 及以上版本提供了一个叫做 prefetch_related
的功能,用来处理相关数据。
prefetch_related
这个方法和 select_related
有点像,但它不直接在数据库中连接数据。相反,它会执行额外的数据库查询,然后在 Python 代码中把数据连接起来。