3

3 つのモデルがあるとします。

class Franchises
    name = models.CharField()

class Stores
    franchise = models.ForeignKey(Franchises)
    name = models.CharField()

class Items
    store = models.ForeignKey(Stores)
    name = models.CharField()

ビューで

items = Items.objects.all()

テンプレートで

{% for item in items %}
  <div>item.store.franchise.name</div>
{% endfor %}

item.store.franchise.name を実行するとデータベースにヒットするのだろうか?データベースへのアクセスを最適化するために何をする必要がありますか?

4

1 に答える 1

6

django のクエリは遅延型です。つまり、アクセスされるまでできるだけ解決しようとしないということです。したがって、今すぐデータベースにアクセスして参照を取得storeし、次に参照を取得しfranchiseます。そして、それはそれらの結果 (多くのクエリ) の各項目についてです。

これらのリレーションが必要になることがわかっている場合は、クエリにそれらすべてをすぐに取得するように指示できます。

Items.objects.selected_related('store__franchise').all()

Django は事前に結合を行い、関連するオブジェクトの各結果が既にキャッシュされていることを確認します。それらをヒットすると、それ以上のクエリはトリガーされません。

select_related の詳細はこちら

これをテストするための本当にクールな方法は、django シェルを起動して、./manage.py shell発行されるクエリを確認することです。

from django import db
from django.db import connection

db.reset_queries()

items = list(Items.objects.all())
print connection.queries

db.reset_queries()

items = list(Items.objects.selected_related('store__franchise').all())
print connection.queries
于 2012-08-16T22:38:11.613 に答える