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

Django引用foreign key时显示modelname object(1)的原因及解决方法

问题产生原因

Django为每个模型类提供了默认的__str__方法,当你没有给关联模型自定义该方法时,外键字段关联的对象被转成字符串展示时,就会返回固定格式的默认值:<模型类名 object (<主键值>),也就是你看到的x object(1)。
注意:这个展示效果不代表数据读取错误,外键字段在数据库中实际存储的仍然是关联的主键值1,只是默认字符串渲染规则不符合预期而已。

对应解决方法

根据你的实际使用场景,选对应方案即可:

  • 仅需获取外键存储的原始ID值
    Django会为所有外键字段自动生成一个{外键字段名}_id的内置属性,直接调用这个属性就能拿到纯ID值,不需要额外修改模型定义:
    # 假设Y模型中关联X模型的外键字段名为x
    y_instance = Y.objects.get(pk=1)
    # 直接取原始关联ID,返回值就是整数1
    related_id = y_instance.x_id
    
  • 自定义外键关联对象的展示内容
    给被关联的X模型重写__str__方法,指定对象转字符串时的返回值,后续所有渲染X模型实例的场景都会用你自定义的内容,不会再出现默认的object格式:
    class X(models.Model):
        # 原有X模型的字段定义,例如
        x_name = models.CharField(max_length=64)
    
        def __str__(self):
            # 按需返回想要展示的内容即可,比如返回ID
            return str(self.id)
            # 如果需要展示名称就改为 return self.x_name
    
  • 列表查询时直接返回纯ID值
    如果是用values()/values_list()做批量查询,直接指定读取{外键字段名}_id字段,就能在查询结果中直接拿到纯ID,不会返回关联对象:
    # 查询结果中会直接包含x_id字段,值为存储的原始关联ID
    query_result = Y.objects.filter(xxx=xxx).values("id", "x_id")
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:24:24