2009-09-06 7 views
14

Django:ManyToManyFieldでselect_related

私は持っています:

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) 

どのようにAliasにすべてのachiever_setawardsが入っているのですか?

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

エイリアスが既に獲得した賞(中間テーブルと賞の両方)には、多くのアクセス権が必要です。どのようにこれらのすべてをバッチすることができますか?

答えて

21

Djangoバージョン1.4以上には、prefetch_relatedがあります。

prefetch_relatedの方法はselect_relatedと似ていますが、データベース結合は行いません。代わりに、追加のデータベースクエリを実行し、Pythonで結合します。

3

Django 1.4を使用していない場合は、django-batch-selectライブラリもあります。これは基本的にprefetch_relatedと同じ方法で動作します。

関連する問題