template select_related query prefetch_related multiple examples example python django django-models django-select-related

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.