Django: select_related with 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)

Как я могу иметь Alias, у которого есть все его achiever_set и awards preopulated?

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

Мне понадобится большой доступ к награде, которую уже получил алиас (как промежуточная таблица, так и сами награды). Как я могу пакетно все это?

Ответ 1

Для версий Django версии 1.4 и выше prefetch_related

Метод prefetch_related похож на select_related, но не делает соединение с базой данных, Вместо этого он выполняет дополнительные запросы к базе данных и выполняет объединение в Python.

Ответ 2

Если вы не используете Django 1.4, там также находится библиотека django-batch-select, которая работает в основном так же, как и prefetch_related.