odoo17 odoo.api.create: The model XXX is not overriding the create method in batch

在 Odoo 17 中,这个警告表明你的 create() 方法没有正确处理批量创建(batch create)的情况。Odoo 17 优化了创建流程,要求 create() 方法能够处理批量记录创建

原代码:

    @api.model
    def create(self, vals):
        jg = super().create(vals)
        ywj = jg.png_ys
        jg.png = self.yzhchuli(ywj)
        jg.fjtjr = self.env.user
        return jg

这个警告表明在模型中重写了 `create` 方法,但是并没有处理批量创建(batch create)的情况。在Odoo 17中,当使用 `create` 方法创建多个记录时,它是以批处理方式进行的。因此,重写 `create` 方法时,应该考虑到一次创建多条记录的情况。

题分析: 1. 参数 `vals` 可能是单个字典(创建一条记录)或字典列表(批量创建多条记录)。但在你的代码中,`super().create(vals)` 返回的是一个包含新创建记录的记录集(可能是多条记录)。 2. 然后你试图从 `jg`(记录集)中获取 `png_ys` 字段,但记录集可能包含多个记录。这样直接访问 `jg.png_ys` 会得到什么?在Odoo中,如果记录集包含多个记录,访问字段值会返回一个列表(或引发错误,取决于上下文)。但这里你期望的是一个文件(或二进制数据)?而且,你只处理了第一个记录? 3. 同样,你只给 `jg.png` 赋值,但记录集有多个记录时,这样赋值会出错,因为不能直接给多个记录赋值(除非使用循环)。 4. 另外,给 `fjtjr` 赋值也是同样的问题。

解决方案: 重写 `create` 方法时,应该处理批量创建的情况。通常的做法是: - 先调用 `super().create(vals)` 创建记录集。 - 然后遍历这个记录集,为每个记录设置计算值(如果需要)。 但是注意:在创建过程中,如果使用循环来更新记录,可能会触发多次写操作,影响性能。因此,如果可能,应尽量使用批量写操作。

    @api.model
    def create(self, vals_list):
        # jg = super().create(vals)
        # ywj = jg.png_ys
        # jg.png = self.yzhchuli(ywj)
        # jg.fjtjr = self.env.user
        # return jg
        # 处理批量创建:vals_list 是字典列表
        if not isinstance(vals_list, list):
            vals_list = [vals_list]

        # 预处理:添加默认值
        for vals in vals_list:
            vals.setdefault('fjtjr', self.env.user.id)

        # 批量创建记录
        records = super().create(vals_list)

        # 后处理:对每个记录执行操作
        for record in records:
            if record.png_ys:  # 检查是否有值
                # 处理图片并更新字段
                record.png = self.yzhchuli(record.png_ys)

        return records

运行后仍然提示:

WARNING odjia002 odoo.api.create: The model odoo.xxxx is not overriding the create method in batch

from odoo import api, models

class Yinzhang(models.Model):
    # ... 其他模型定义 ...
    
    @api.model_create_multi
    def create(self, vals_list):
        # 预处理:设置默认值
        for vals in vals_list:
            vals.setdefault('fjtjr', self.env.user.id)
        
        # 批量创建记录
        records = super().create(vals_list)
        
        # 后处理:图片处理
        for record in records:
            if record.png_ys:
                # 注意:这里使用 record 实例调用 yzhchuli 方法
                record.png = record.yzhchuli(record.png_ys)
        
        return records

关键修改说明:

  1. 必须使用 @api.model_create_multi 装饰器

    • 这是 Odoo 17 专门为批量创建设计的装饰器

    • 替换了原来的 @api.model 装饰器

  2. 参数名必须为 vals_list

    • Odoo 17 会检查方法签名

    • 确保参数名是 vals_list 而不是其他名称

  3. 正确处理记录集

    • 在遍历记录时,直接使用 record.yzhchuli() 而不是 self.yzhchuli()

    • 因为 self 在装饰器上下文中是模型类而不是记录实例

    • 使用self.yzhchuli()也不会再提示警示了

你可能感兴趣的:(odoo错误分析,python,开发语言)