過度のデータベース ヒットを回避するために、django でクエリを構造化する最良の方法を理解しようとしています。
これは質問に似ています:外部キー クエリを使用した Django のベスト プラクティスですが、クエリの「深さ」が大きくなります。
私の状況: models.py
class Bucket(models.Model):
categories = models.ManyToManyField('Category')
class Category(models.Model):
name = models.CharField(max_length=50)
class SubCategory(models.Model):
category = models.ForeignKey(Category)
class SubSubCategory(models.Model):
subcat = models.ForeignKey(SubCategory)
ビュー.py
def showbucket(request, id):
bucket = Bucket.objects.prefetch_related('categories',).get(pk=id)
cats = bucket.categories.prefetch_related('subcategory_set__subsubcategory_set',)
return render_to_response('showbucket.html', locals(), context_instance=RequestContext(request))
および関連するテンプレート:
{% for c in cats %}
{{c}}
<ul>
{% for d in c.subcategory_set.all %}
<li>{{d}}</li>
<ul>
{% for e in d.subsubcategory_set.all %}
<li>{{e}}</li>
{% endfor %}
</ul>
{% endfor %}
</ul>
{% endfor %}
prefetch_related() を使用しているにもかかわらず、上位 2 つの for ステートメントが評価されるたびにデータベースにアクセスしているように見えます (例: {% for c in cat %}) (少なくとも、debug_toolbar を読むとそう思います)。私が試した他の方法では、(C x D x E) 件のデータベース ヒットが発生しました。これは、プリフェッチ、クエリ、またはモデルの使用に本質的に問題がありますか? いわば「深さ> 1」のデータベースオブジェクトにアクセスするDjangoの最良の方法は何ですか?