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
相关产品推荐
相关产品推荐

