python - select_related - multiple prefetch_related django
Django: select_related with ManyToManyField (2)
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.
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?
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.