我尝试重建此示例: https://blog.roseman.org.uk/2010/01/11/django-patterns-part-2-efficient-reverse-lookups/
我有一个模型“产品”和一个模型“订单”。订单具有“产品”的外键。因此,对于1个产品,我有N个订单
在我的模板中,我必须显示很多信息,因此我想避免在我的模板中执行“用于Product.order_set.all()中的订单”
在我的模板中,如果我写:
{{ object_list.1.related_items }}
一切都很好,我得到了我想要的 但是如果我写:
{% for i in object_list %}
{{ object_list.i.related_items }}
{% endfor %}
我没有结果。
有人可以告诉我如何解决这个问题吗?
我的object_list与上面的示例几乎相同:
products = Product.objects.all()
i = 0
qs = Product.objects.all()
obj_dict = dict([(obj.id, obj) for obj in qs])
objects = Order.objects.filter(producttyp__in=qs)
relation_dict = {}
for obj in objects:
relation_dict.setdefault(obj.producttyp_id, []).append(obj)
for id, related_items in relation_dict.items():
obj_dict[id].related_items = related_items
def get(self,request,*args,**kwargs):
context = {'object_list':self.obj_dict}
return render(request,self.template_name,context)
我所做的唯一更改是来自 obj_dict [id] ._ related_items到obj_dict [id] .related_items是因为不允许使用下划线?!
如何在模板中打印列表,如:
- Product A
- Order 1
- Order 2
- Order 5
- Product B
- Order 3
- Order 6
最好的问候
答案 0 :(得分:0)
这是合乎逻辑的,因为Django在这里不将i
解释为变量,而是将其解释为标识符,因此它旨在访问object_list.i
或object_list['i']
,而不是{{1} }。
但是,您在这里不需要object_list.1
,只需访问i
中的related_items
,例如:
object
如果顾名思义,{% for object in object_list %}
{{ object.related_items }}
{% endfor %}
也是一个集合,我们也可以迭代这些项目:
related_items
对于字典,我们可以访问{% for object in object_list %}
{% for subitem in object.related_items %}
{{ subitem }}
{% endfor %}
{% endfor %}
,例如:
.values
编辑:针对列表视图的具体情况。您可以使用.prefetch_related
通过一个额外的查询来获取所有关系:
{% for object in object_dict.values %}
{{ object.related_items }}
{% endfor %}
然后您可以在模板中将其呈现为:
class MyListView(ListView):
queryset = Product.objects.prefetch_related('order_set')
template = 'my_template.html'