无法呈现与M2M字段链接的对象的属性

时间:2018-03-23 09:15:10

标签: django templates many-to-many

尝试通过m2m字段呈现与另一个对象链接的对象的属性。

#models

class Arm(models.Model):
    cmrs = models.ManyToManyField(CMR, null=True)


class CMR(models.Model):
    client = models.ForeignKey('Client', on_delete=models.CASCADE, 
    null=True, default="", blank=True)

视图

if us.groups.filter(name__in = ['prime']):
            query_set = Plan.objects.order_by('-pk')
            query_ys = Arm.objects.filter(date=ys)
            query_rn = Arm.objects.filter(date=rn)
            query_tm = Arm.objects.filter(date=tm)
            client_rn = query_rn.prefetch_related('cmrs')
            args = {'query_rn': query_rn,
                    'cl_rn': client_rn,
                    'query_tm': query_tm,
                    'query_ys': query_ys,
                    'query_set': query_set
                    }
            return render(request, 'personnel/schedule/test-schedule-full.html', args)

和模板

<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 idem in cl_rn.cmrs.all %} {{ idem.client }} {% 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>

我要做的是显示与clientCMR关联的Arm个对象的<td class="cell100 column2"></td>字段的所有值,但它没有显示任何内容代替。

1 个答案:

答案 0 :(得分:0)

为prefetch_related调用提供单独的查询集是没有意义的。你正在迭代query_rn,你需要在同一个查询集上定义prefetch_related,然后从那里迭代相关的对象;你根本不需要client_rn。所以:

query_rn = Arm.objects.filter(date=rn).prefetch_related('cmrs')

...

{% for query in query_rn %}
    {% for idem in query.cmrs.all %} {{ idem.client }} {% endfor %}
{% endfor %}

另请注意,代码的第一行有点偏。您不应该将__in与单列表元素一起使用,只需检查是否相等;并且由于您只想检查相关组是否存在,您应该使用exists()方法,这种方法效率稍高:

if us.groups.filter(name='prime').exists():