You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django模板中外键关联对象显示异常,求解决方法

解决Django中外键关联对象显示"MprVw object()"的问题

1. 给模型添加__str__方法

Django模型默认的__str__方法会返回类似"ModelName object()"的通用描述,你需要自定义这个方法,指定对象被展示时返回的字段值。修改models.py:

class MprVw(models.Model):
    payloadid = models.TextField(db_column='payLoadID', blank=True, null=True)
    file = models.TextField(db_column='File', primary_key=True)
    
    def __str__(self):
        # 返回你想展示的字段,这里用主键file字段
        return self.file

    class Meta:
        managed = False
        db_table = 'MPR_VW'


class MprWi(models.Model):
    id = models.TextField(db_column='id', primary_key=True)
    payloadid = models.TextField(db_column='payLoadID', blank=True, null=True)
    file = models.ForeignKey(MprVw, on_delete=models.DO_NOTHING, db_column='File')
    
    def __str__(self):
        return self.id

    class Meta:
        managed = False
        db_table = 'MPR_WI'

2. 修正模板中的循环逻辑

你的myMPR是filter返回的查询集(QuerySet),不是单个对象,直接调用myMPR.mprwi_set.all会出错。需要先遍历查询集中的每个MprVw对象,再获取对应的MprWi子记录:

{% for mprvw in myMPR %}
    {% for mprwi in mprvw.mprwi_set.all %}
    <tr>
        <td>
            {{ mprwi.file }}  <!-- 因为MprVw的__str__返回file字段,这里会直接显示file值 -->
            {{ mprwi.id }} 
        </td>
    </tr>
    {% endfor %}
{% endfor %}

如果需要明确指定关联对象的某个字段,也可以直接写{{ mprwi.file.file }}或者{{ mprwi.file.payloadid }}。

3. 优化视图查询(可选)

为了减少数据库查询次数,提升页面加载性能,可以在视图中用prefetch_related预加载关联的MprWi数据:

def MPR(request):
    myDls = request.GET.get("dls")
    # 预加载关联的MprWi记录,避免模板循环时多次查询数据库
    myMPR = MprVw.objects.filter(dls=myDls).prefetch_related('mprwi_set')
    context = {
        'myMPR': myMPR,
        'myDls': myDls,
    }
    MPR = loader.get_template('MPR.html')
    return HttpResponse(MPR.render(context, request))

内容的提问来源于stack exchange,提问作者DjangoBanjo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 06:42:30