我有一些嵌套模型
class Category(models.Model):
name = models.CharField()
class FacetQuestion(models.Model):
category = models.ForeignKey(Category)
description = models.CharField()
class FacetAnswer(models.Model):
question = models.ForeignKey(FacetQuestion)
answer = models.CharField()
subject = models.SmallIntegerField(default=1)
我至少可以在视图中有效地获取所有答案/问题/类别:
def detail(request, id):
facets= models.Category.objects.
filter(facetquestion__facetanswer__subject='test').
select_related()
return render_to_response('test.tpl',
dict(facets=facets,
STATIC_URL = settings.STATIC_URL,
MEDIA_URL = settings.MEDIA_URL),
context_instance=RequestContext(request))
但是当我在模板中循环它们时,我得到了所有内容(不仅仅是我过滤的内容),因为模板会对所有问题和所有答案进行额外查询。所以模板代码肯定是假的:
{% for category in answers %}
{% for q in category.facetquestion_set.all %}
{% for a in q.facetanswer_set.all %}
{% endfor %}
{% endfor %}
{% endfor %}
以逻辑顺序显示嵌套模型集的好模式是什么?
Category
Question
Answer (subject=test)
Answer (subject=test)
Question
Answer (subject=test)
Category
Question
Answer (subject=test)
我正在使用django 1.3。我问了一个类似的问题here,但那个问题没有按主题过滤。
答案 0 :(得分:1)
我不知道如何解决你的问题,但我想我可以告诉你哪里出错了。
使用此行
answers = models.Category.objects.filter(facetquestion__facetanswer__subject=2)
您正在选择包含一个或多个问题的所有类别,这些问题包含一个或多个具有subject == 2
的答案。
当您迭代所选类别时:
{% for category in answers %}
{% for q in category.facetquestion_set.all %}
{% for a in q.facetanswer_set.all %}
在每个循环中,您发出另一个查询,该查询会提取类别(category.facetquestion_set.all
)中的所有问题以及该问题的所有答案(q.facetanswer_set.all
)。
无论过滤器如何。
您可以使用此代码段以DEBUG模式打印SQL,并了解幕后发生的事情:http://djangosnippets.org/snippets/93/
...在这种情况下,我会打印很多SELECT。