2009-09-06 8 views
14

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

Comment puis-je avoir un Alias qui a toute sa achiever_set et awards prérempli?

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

Je vais avoir besoin de beaucoup d'accès à l'attribution qu'un alias a déjà obtenu (à la fois la table intermédiaire et les prix eux-mêmes). Comment puis-je traiter tous ces éléments?

Répondre

21

Les versions 1.4 et supérieures de Django ont prefetch_related à cette fin.

La méthode prefetch_related est similaire à select_related, mais ne fait pas de jointure de base de données. Au lieu de cela, il exécute des requêtes de base de données supplémentaires et effectue la jonction en Python.

3

Si vous n'êtes pas sur Django 1.4, il y a aussi la bibliothèque django-batch-select, qui fonctionne essentiellement de la même manière que prefetch_related.