Odoo 13导入CSV联系人时自动序列编号失效问题求助
解决Odoo 13导入CSV时res.partner序列编号不自动生成的问题
我来帮你搞定这个问题!你遇到的核心问题是CSV导入时,create方法里的条件判断没有触发序列生成——当CSV里没有包含ref列时,vals字典里根本不存在'ref'这个键,导致你原来的if 'ref' in vals and vals['ref'] == False条件不成立,自然不会自动生成序列编号。
解决方案:修改create方法的判断逻辑
把判断条件改成更宽松的逻辑,只要ref字段为空(不管是显式传了空值,还是根本没传这个字段),就自动生成序列。同时你已经配置了no_gap类型的序列,能保证编号无间隙、不重复,我们只需要让导入场景也触发序列生成即可。
修改后的model.py代码如下:
class ResPartner(models.Model): _inherit = 'res.partner' ref = fields.Char(string='Reference', readonly=True) @api.model def create(self, vals): # 只要ref为空(没传字段或传了空值),就自动生成序列 if not vals.get('ref'): vals['ref'] = self.env['ir.sequence'].next_by_code('partner') return super(ResPartner, self).create(vals)
为什么这个修改有效?
vals.get('ref')会返回vals里'ref'对应的值,如果'ref'不存在则返回None,not None结果为True,刚好覆盖CSV导入时没传ref的场景。- 不管是手动创建(此时
vals里可能带ref: False)还是CSV批量导入(vals里没有ref键),都会触发序列生成逻辑。 - 你在
sequence.xml里设置的implementation="no_gap"已经让Odoo自动保证序列的连续性和唯一性,不用担心重复或间隙问题。
额外注意事项
- 如果你的CSV里有部分记录已经填写了
ref值,修改后的代码会保留这些自定义值,只有空值的记录才会自动生成编号,完全符合需求。 - 你的
init.py代码是用来给已有无ref的联系人补全编号,这个逻辑没问题,不需要修改。 - 测试导入时,确保CSV里的
ref列要么留空,要么直接删除该列,这样导入的新联系人就会自动生成序列编号了。
内容的提问来源于stack exchange,提问作者Armando Peña
相关产品推荐
相关产品推荐

