我有一个DetailView来显示菜单(餐厅),结构如下:
菜单>课程> Course_Categories>碗碟 即(Theather Menu)> (起始者,主菜,甜点)> (鱼汤,肋骨等)
我想预取course_categories和菜肴,除此之外,我想在模板中使用的每个菜肴上设置属性。此属性(价格)取决于一天中的时间,因此它不是简单地存储在Dish上的值。
我尝试了以下内容:
class MenuView(generic.DetailView):
template_name = "cms/detail/menu.html"
model = Menu
def get_object(self, queryset=None):
pkValue = pk = self.kwargs.get(self.pk_url_kwarg, None)
menu = Menu.objects.get(id=pkValue)
courses = menu.courses.all().prefetch_related('course_categories').prefetch_related('dishes')
for course in courses.all().iterator():
for course_category in course.course_categories.all().iterator():
for dish in course_category.dishes.all().iterator():
dish.price = "0.00"
return menu
当我在我的模板中迭代数据时,它会显示所有内容,但不会显示dish.price属性的值。我认为发生的是重新检索相关集,因此我的自定义集属性不会显示。
模板:
{% for course in menu.courses.iterator %}
<tr>
<td><strong>{{ course.name }}</strong></td>
</tr>
{% for course_category in course.course_categories.iterator %}
<tr>
<td><em> {{ course_category.name }}</em></td>
</tr>
{% for dish in course_category.dishes.iterator %}
<tr>
<td> {{ dish.name }} {{ dish.price}}</td>
</tr>
{% endfor %}
{% endfor %}
{% endfor %}
有什么建议吗?
答案 0 :(得分:1)
您正在使用明确不缓存结果的iterator()
。执行{% for course in menu.courses.iterator %}
时,将再次从数据库中提取结果。
在您的视图中使用.all()
代替.all().iterator()
,并停止在模板中使用.iterator,并且您不应该遇到问题。