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

如何在Django的Company模型__str__方法中获取关联的Official Name?

解决Django中Company模型__str__方法获取Official Name的问题

原模型代码

Company模型

class Company(models.Model):
    note = models.TextField(_('note'), blank=True, null=True)
    class Meta:
        verbose_name = _('Company')

    def __str__(self):
        return f'{self.id}'

CompanyName模型

class CompanyName(models.Model):
    company = models.ForeignKey(Company, related_name='name_set')
    type = models.CharField(_('type'), max_length=4, choices=NameType.choices)
    name = models.CharField(_('name'), max_length=256)

    class Meta:
        verbose_name = _('Company name')

    def __str__(self):
        return f'{self.type} {self.name}'

需求说明:每个公司可关联多个不同类型的名称(Official Name、Short Name等),需要修改Company模型的__str__方法,返回关联的Official Name,替代当前的ID。

修改方案

直接修改Company模型的__str__方法,通过反向关联的name_set过滤出类型为Official Name的记录,同时处理该记录不存在的情况(避免报错):

class Company(models.Model):
    note = models.TextField(_('note'), blank=True, null=True)
    
    class Meta:
        verbose_name = _('Company')

    def __str__(self):
        # 过滤出类型为Official Name的记录,取第一条
        official_name = self.name_set.filter(type=NameType.OFFICIAL).first()
        # 存在则返回名称,否则返回ID作为 fallback
        return official_name.name if official_name else f'{self.id}'

注意事项

  • 确保NameType.OFFICIAL对应的取值与CompanyName模型中type字段的choices选项完全匹配。例如如果NameType的choices定义是[('OFFI', _('Official Name')), ('SHRT', _('Short Name'))],则需要将代码中的NameType.OFFICIAL替换为'OFFI'(如果NameType是普通choices而非枚举类的话)。
  • 若担心多次调用__str__触发重复数据库查询,可在查询Company时使用prefetch_related('name_set')预加载关联数据,但单条查询场景下通常无需额外优化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:12:08