29

私は持っています :

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

エイリアスがすでに取得しているアワード(中間テーブルとアワード自体の両方)に多くのアクセスが必要になります。これらすべてをバッチ処理するにはどうすればよいですか?

4

2 に答える 2

35

Djangoバージョン1.4以降にはprefetch_related、この目的があります。

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

于 2012-02-24T13:00:05.020 に答える
3

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

于 2012-04-13T00:23:20.170 に答える