代码之家  ›  专栏  ›  技术社区  ›  Carlos Troyano

为什么我的One2Many字段不保存多条记录?

  •  1
  • Carlos Troyano  · 技术社区  · 7 年前

    我有两个模型。一个模型有一个 指向另一个的字段。当我保存主记录时,它只保存 One2many公司 关系我需要它来保存n个记录。可能问题是我计划的数据结构。

    提前谢谢。

    这是第一个类,它称第二个类为One2Many关系。

    类EmpleadosProductos(models.Model): _name=“员工作为产品”

        #the One2Many relation of the trouble
        employee_line = fields.One2many(
            'employee.line', 
            'id', 
            string='Employee Lines',
            store=True
            )
    
        companyias = fields.Many2one('res.partner', 'Compañia', domain=[('is_company', '=', True)])
        amount_total = fields.Monetary(string='Total', store=True, readonly=True, compute='_calcularTotal')
        journal_entry = fields.Many2one('account.move')
        currency_id = fields.Many2one('res.currency', 'Currency', required=True, default=lambda self: self.env.user.company_id.currency_id.id)
        fecha = fields.Date('Fecha')
        referencia = fields.Char(string='Ref', required=True) 
        _sql_constraints = [
            ('refererecia_constraint', 'unique(referencia)', 'La referencia debe de ser única!'),
        ]
        @api.one
        @api.depends('employee_line.total')
            def _calcularTotal(self):
                for empleado_obra in self:
                    acumulador = 0.0
                    for linea in empleado_obra.employee_line:
                        acumulador += linea.total
                    empleado_obra.update({
                        'amount_total': acumulador
                    })
    

    这是在 One2Many公司 关系

    class EmployeLine(models.Model):
        _name = 'employee.line'
        descripcion = fields.Text(string='Descripción', required=False)
        employee_id = fields.Many2one(
            'hr.employee', 
            string="Empleado",
            requiered=True,
            change_default=True
            )
    
        currency_id = fields.Many2one('res.currency', 'Currency', required=True, default=lambda self: self.env.user.company_id.currency_id.id)
        apodo = fields.Char('apodo', readonly=False)
        precio_por_hora = fields.Float('Sueldo/hora', store=True)
        numero_de_horas =  fields.Integer('Número de horas', store=True)
    
        total = fields.Monetary(string='Total', store=True, readonly=True, compute='_calcularTotalLine')
        _rec_name = 'apodo'
    
        @api.one
        @api.depends('numero_de_horas', 'precio_por_hora')
            def _calcularTotalLine(self):
                 self.update({
                        'total': (self.precio_por_hora * self.numero_de_horas)
                    })
    
        @api.onchange('employee_id')
            def onchange_employee_id(self):
                addr = {}
                if not self.employee_id.display_name:
                    return addr
                if not self.employee_id.apodo:
                    self.apodo = "no apodo"
                else:
                    self.apodo = self.employee_id.apodo
                    self.precio_por_hora = self.employee_id.precio_por_hora
                return addr
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   forvas    7 年前

    这是你的 One2many公司 (我添加参数名称以更清楚地解释情况):

    # The One2Many relation of the trouble
    employee_line = fields.One2many(
        comodel_name='employee.line', 
        inverse_name='id', 
        string='Employee Lines',
        store=True,
    )
    

    有了这个密码,你就告诉奥多 许多21 名为的字段 id 在里面 employee.line 指向的模型 employee.as.product 模型当然,有一个 身份证件 字段输入 受雇者线 模型,但它不是的ID 受雇者像产品 完全它是每个记录的键,默认情况下在每个模型中创建(在本例中 受雇者线 ),因此不能将其设置为 inverse_name One2many公司 .

    你想要的是:

    创建 许多21 字段输入 受雇者线 型号:

    employee_as_product_id = fields.Many2one(
        comodel_name='employee.as.product',
        string='Empleado/Producto',
    )
    

    更正您的 One2many公司 字段输入 受雇者像产品 建模方式:

    employee_line = fields.One2many(
        comodel_name='employee.line', 
        inverse_name='employee_as_product_id', 
        string='Employee Lines',
        store=True,
    )
    

    One2many字段将按预期工作。