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

