2009-09-06 17 views
14

mam:Django: select_related z 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) 

Jak mogę mieć Alias który wszyscy jego achiever_set i awards oznakowane?

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

zamierzam potrzebują dużo dostępem do przyznania, że ​​alias już dostał (zarówno stół pośredni a same nagrody). Jak mogę je wszystkie wsypać?

Odpowiedz

21

Wersje Django w wersji 1.4 i wyższej mają w tym celu prefetch_related. Ta metoda jest podobna do select_related, ale nie wykonuje połączenia z bazą danych. Zamiast tego wykonuje dodatkowe zapytania do bazy danych i łączy się w Pythonie.

3

Jeśli nie jesteś na Django 1.4, istnieje również biblioteka django-batch-select, która działa w zasadzie w ten sam sposób, co prefetch_related.

Powiązane problemy