Django: select_related with ManyToManyField

Yo tengo :

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) 

¿Cómo puedo tener un Alias que tenga todos sus achiever_set y awards prepopulados?

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

Voy a necesitar mucho acceso al premio que ya ha recibido un alias (tanto la tabla intermedia como los premios mismos). ¿Cómo puedo agrupar todo esto?

Las versiones 1.4 y posteriores de Django tienen prefetch_related para este propósito.

El método prefetch_related es similar a select_related , pero no hace una unión de base de datos. En su lugar, ejecuta consultas de base de datos adicionales y realiza la unión en Python.

Si no estás en Django 1.4, también está la biblioteca django-batch-select , que funciona básicamente de la misma manera que prefetch_related.