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

Odoo模块开发问题:Many2one作为选择字段显示异常

解决Odoo Many2one字段显示模型名+ID而非城市名称的问题

这个问题核心是Odoo没法确定你的城市模型该用哪个字段作为记录的显示名称,所以默认展示了模型标识+ID。下面是几种实用的解决方案,你可以根据自己的场景选:

1. 给目标模型设置_rec_name属性

这是最直接的方式,明确告诉Odoo用哪个字段来显示记录名称:

假设你的城市模型定义是这样的,直接加一行_rec_name配置就行:

from odoo import models, fields

class Ville(models.Model):
    _name = 'ville'  # 对应你Many2one字段里的comodel_name
    _rec_name = 'ville_en_francais'  # 指定用这个字段的值作为显示名称

    ville_en_francais = fields.Char(string="Ville en français")
    # 其他字段...

设置完成后,所有关联这个模型的Many2one字段都会自动显示ville_en_francais的内容。

2. 重写目标模型的name_get()方法

如果需要更灵活的显示逻辑(比如同时展示城市名和邮编),可以自定义name_get()方法来控制显示内容:

class Ville(models.Model):
    _name = 'ville'

    ville_en_francais = fields.Char(string="Ville en français")
    code_postal = fields.Char(string="Code postal")

    def name_get(self):
        result = []
        for ville in self:
            # 自定义显示格式,比如"城市名 (邮编)",没有邮编就只显示城市名
            display_name = f"{ville.ville_en_francais} ({ville.code_postal})" if ville.code_postal else ville.ville_en_francais
            result.append((ville.id, display_name))
        return result

这种方法适合需要组合多个字段作为显示名称的场景。

3. 检查Many2one字段的定义

先确认你的Many2one字段指定了正确的comodel_name,别写错模型名:

ville_id = fields.Many2one('ville', string="Ville")

如果comodel_name写错,Odoo找不到对应模型,也会出现这种异常显示。

4. 视图层面的小检查

如果只是某个特定视图显示异常,看看视图里的Many2one字段有没有错用widget,默认用many2one widget就好,别误设成selection之类的:

<field name="ville_id" widget="many2one"/>

按照上面的方法调整后,你的Many2one字段应该就能正常显示数据库里ville_en_francais的内容啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:04:02