我试图了解在 django 中构造查询以避免过多的数据库命中的最佳方法。
这类似于问题:Django best practice with foreign key queries,但在查询中涉及更大的“深度”。
我的情况: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(),但每次评估前两个 for 语句时,我似乎都在访问数据库,例如 {% for c in cats %},(至少我从阅读 debug_toolbar 中相信如此)。我尝试过的其他方法以 (C x D x E) 数量的数据库命中而告终。这是我使用预取、查询或模型的固有问题吗?可以说,Django 访问具有“深度> 1”的数据库对象的最佳方法是什么?