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

Django视图中外键显示为对象而非customerid的问题求助

解决Django模板中外键显示为“Customers object”的问题

嘿,这问题我之前也碰到过!原因很简单:你的order.customerid其实是一个Customers模型的实例对象,而不是直接的ID值。Django默认会调用模型的__str__()方法来输出实例,默认的__str__就是返回“模型名 object”,所以才会显示成“Customers object”。

下面给你几个靠谱的解决方案,按优雅程度排序:

方法1:给Customers模型添加自定义的__str__方法(推荐)

这是一劳永逸的做法,以后任何地方输出Customers实例都会显示你想要的内容。修改你的models.py里的Customers类:

class Customers(models.Model):
    customerid = models.AutoField(primary_key=True)
    fname = models.CharField(max_length=50, blank=True, null=True)
    lname = models.CharField(max_length=50, blank=True, null=True)
    # ... 其他字段保持不变

    def __str__(self):
        # 这里可以返回customerid,或者组合姓名(比如return f"{self.fname} {self.lname}")
        return str(self.customerid)

    class Meta:
        managed = False
        db_table = 'customers'

改完之后,模板里原来的{{ order.customerid }}就会直接显示对应的customerid数值了。

方法2:在模板中直接访问外键实例的customerid字段

如果不想修改模型,也可以在模板里直接指定要显示的字段:

<p><strong> {{ order.customerid.customerid }} <br> {{ order.orderid }} <br> </strong> <br>

注意这里是order.customerid.customerid:第一个customerid是Orders模型里的外键字段名,第二个customerid是Customers模型里的主键字段名。

方法3:在视图中预先处理数据(不推荐,没必要)

你之前想在视图里处理,其实完全没必要,不过还是给你举个例子,比如把customerid单独提取出来放到每个order对象里:

def orders(request):
    orders = Orders.objects.all()
    for order in orders:
        # 给每个order对象加一个customer_id属性,判断避免空值报错
        order.customer_id = order.customerid.customerid if order.customerid else None
    context = {'orders': orders}
    return render(request,'albums/orders.html', context)

然后模板里用{{ order.customer_id }}来显示,但这种方法不如前两种简洁,不推荐使用。

总结一下,最推荐的是方法1,既优雅又能统一所有地方的显示效果~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:54:01