无法渲染通过多对多字段关联的对象属性问题求助
解决Django多对多字段关联属性渲染无内容问题
我帮你排查了下代码,问题主要出在视图中不必要的变量定义和模板中错误的关联对象访问方式上,下面是具体的修正方案:
问题分析
- 视图里你定义了
client_rn = query_rn.prefetch_related('cmrs'),但query_rn本身就是Arm的查询集,这个client_rn完全是多余的;而且模板里错误地用它来访问cmrs关联——你应该针对循环中的每个单个Arm实例去访问它的多对多字段,而不是整个查询集。 - 模板中
{% for idem in cl_rn.cmrs.all %}这一行,cl_rn是查询集,不是单个Arm对象,自然拿不到对应的关联CMR数据,所以这一列无内容。
修正后的代码
1. 视图代码调整
直接在query_rn上添加prefetch_related,优化查询性能同时确保关联数据能被正确获取:
if us.groups.filter(name__in = ['prime']): query_set = Plan.objects.order_by('-pk') # 直接在query_rn上预取cmrs关联,避免N+1查询 query_rn = Arm.objects.filter(date=rn).prefetch_related('cmrs') query_ys = Arm.objects.filter(date=ys) query_tm = Arm.objects.filter(date=tm) # 移除多余的client_rn变量 args = {'query_rn': query_rn, 'query_tm': query_tm, 'query_ys': query_ys, 'query_set': query_set } return render(request, 'personnel/schedule/test-schedule-full.html', args)
2. 模板代码调整
在循环每个Arm实例(query)时,访问该实例自己的cmrs多对多字段:
<tbody id="add"> {% for query in query_rn %} <tr class="row100 body {{ query.status }}" data-href="/personnel/arm/{{ query.id }}"> <td class="cell100 column1">{{ query.driver }}</td> <td class="cell100 column2"> {% for cmr in query.cmrs.all %} {{ cmr.client }} {% empty %} <!-- 可选:如果没有关联的CMR,显示默认提示 --> 无关联客户 {% endfor %} </td> <td class="cell100 column3">{{ query.des_from}}</td> <td class="cell100 columnarrow"><i class="fas fa-arrow-circle-right"></i></td> <td class="cell100 column4">{{ query.des_to }}</td> </tr> {% endfor %} </tbody>
额外说明
- 使用
prefetch_related('cmrs')是为了避免Django的N+1查询问题,一次性把所有Arm对应的CMR数据都取出来,提升页面加载性能。 - 添加
{% empty %}块是可选的,用来处理当前Arm没有关联任何CMR的情况,避免列完全空白。
内容的提问来源于stack exchange,提问作者Massimo Saint-Aquille
相关产品推荐
相关产品推荐

