如何基于Many2one字段为project.task.situation模型创建序列
嗨,看你的需求是要给关联到project.task的project.task.situation记录生成按Task分组独立递增的序列对吧?你已经搭好了基础的ir.sequence配置,接下来只需要做几个关键调整就能实现目标,具体步骤我给你拆解清楚:
实现按关联Project Task分组的Situation序列
1. 给模型补充必要字段
首先在project.task.situation模型里,除了你已有的关联project.task的Many2one字段(我默认它叫task_id哈),需要加两个字段:一个存纯数字的序列号,一个存带前缀的最终编号(比如你配置的"Situation N°1"):
from odoo import models, fields, api class ProjectTaskSituation(models.Model): _name = 'project.task.situation' _description = 'Project Task Situation' # 假设你已经配置了这个关联字段 task_id = fields.Many2one('project.task', string='Related Task', required=True) # 存储每个Task下独立的纯数字序列号 sequence_num = fields.Integer(string='Sequence Number', readonly=True) # 最终显示的带前缀的完整编号 name = fields.Char(string='Situation Reference', readonly=True, compute='_compute_full_sequence', store=True) @api.depends('task_id', 'sequence_num') def _compute_full_sequence(self): # 读取你已配置的ir.sequence前缀 seq_config = self.env['ir.sequence'].search([('code', '=', 'project.task.situation')], limit=1) prefix = seq_config.prefix or 'Situation N°' for rec in self: if rec.task_id and rec.sequence_num: rec.name = f"{prefix}{rec.sequence_num}" else: rec.name = ""
2. 重写create方法,按Task生成序列
Odoo原生的ir.sequence是全局递增的,没法直接按自定义字段分组,所以我们在创建Situation记录时,手动统计当前Task下已有的记录数,加1就是新的序列号:
@api.model def create(self, vals): # 只有传入task_id时才生成对应序列 if vals.get('task_id'): # 统计当前Task下已有的Situation数量,加1得到下一个编号 existing_count = self.search_count([('task_id', '=', vals['task_id'])]) vals['sequence_num'] = existing_count + 1 # 可选:加数据库锁防止并发创建时编号重复 self.env.cr.execute("SELECT pg_advisory_lock(%s)", (vals['task_id'],)) # 调用父类方法创建记录 new_rec = super(ProjectTaskSituation, self).create(vals) # 记得释放锁 if vals.get('task_id'): self.env.cr.execute("SELECT pg_advisory_unlock(%s)", (vals['task_id'],)) return new_rec
3. 可选:调整视图显示编号
如果要在表单或列表里展示这个编号,把name字段加到对应视图中即可,比如表单视图的继承示例:
<record id="project_task_situation_form_inherit" model="ir.ui.view"> <field name="name">project.task.situation.form.inherit</field> <field name="model">project.task.situation</field> <!-- 替换成你自己的基础视图ID --> <field name="inherit_id" ref="your_module.project_task_situation_form_base"/> <field name="arch" type="xml"> <field name="task_id" position="after"> <field name="name" readonly="1"/> </field> </field> </record>
小提示
- 确保
task_id是必填字段,不然没法正确分组计算序列 - 数据库锁是为了避免多用户同时给同一个Task创建Situation时出现编号重复,要是你的业务场景并发量低,也可以暂时跳过这一步
内容的提问来源于stack exchange,提问作者Tessnim
相关产品推荐
相关产品推荐

