Django模板如何从Advice QuerySet访问同父表的Indexmapper字段
问题解决方法
问题原因
- 你视图传入模板的
result是Advice类型的QuerySet(多对象集合),不能直接在集合上调用ticker属性,必须先遍历拿到单个Advice对象 Stocks和IndexMapper是一对多关联,你定义的反向关联名related_name='indexmap'是查询管理器,不是单个IndexMapper对象,不能直接调用index_name属性
正确实现方式
1. 模板代码写法
两种写法按需选择:
情况1:确定每个股票在当前筛选逻辑下仅关联1个IndexMapper记录(你的场景已经筛选了NIFTY50的股票,适合用这个)
{% for advice_item in result %} <!-- 单个Advice对象关联的Stocks对象下,取第一个关联的IndexMapper的index_name --> <p>指数名称:{{ advice_item.ticker.indexmap.first.index_name }}</p> <!-- 其他Advice字段你可以照常取,比如 --> <p>建议日期:{{ advice_item.advice_date }}</p> <p>20日最高价:{{ advice_item.high20 }}</p> {% endfor %}
情况2:单个股票可能关联多个IndexMapper记录,需要全部展示
{% for advice_item in result %} <p>股票代码:{{ advice_item.ticker.ticker }}</p> <p>关联指数列表:</p> <ul> {% for index_item in advice_item.ticker.indexmap.all %} <li>{{ index_item.index_name }}</li> {% endfor %} </ul> {% endfor %}
2. 视图查询优化(可选,解决N+1查询问题提升性能)
修改视图中result的查询语句,提前预加载关联数据,避免遍历模板时重复查询数据库:
# 加select_related预加载外键Stocks,prefetch_related预加载反向关联的IndexMapper集合 result = Advice.objects.filter(ticker__in=filter_stock)\ .select_related('ticker')\ .prefetch_related('ticker__indexmap')
内容的提问来源于stack exchange,提问作者shyam yadav
相关产品推荐
相关产品推荐

