2009-09-06 14 views
14

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

¿Cómo puedo tener un Alias el que tiene todos sus achiever_set y awards prepopulated?

>>> 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 un montón de acceso a la adjudicación de un alias que ya ha conseguido (tanto la tabla intermedia y de los propios premios). ¿Cómo puedo combinar todos estos?

Respuesta

21

Las versiones Django 1.4 y posteriores 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 cambio, ejecuta consultas de bases de datos adicionales y realiza la unión en Python.

3

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

Cuestiones relacionadas