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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:04:02