2017-12-13 2 views
1

Ich habe zwei Modelle. Ein Modell hat ein One2Many Feld, das auf das andere verweist. Wenn ich den Hauptsatz speichere, speichert es nur einen Satz der One2many Beziehung. Ich brauche es, um 'n' Aufzeichnungen zu speichern. Vielleicht ist das Problem die Struktur der Daten, die ich geplant habe.Warum speichert mein One2Many-Feld nicht mehr als einen Datensatz?

Hier ist der Code. Es tut mir leid für die spanischen Namen der Variablen.

Vielen Dank im Voraus.

Dies ist die erste Klasse, die es die zweite Klasse mit One2Many Beziehung nennt.

Klasse EmpleadosProductos (models.Model): _name = "employee.as.product"

#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 
       }) 

Dies ist die zweite Klasse in der Beziehung One2Many genannt.

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 

Antwort

0

Das ist Ihre One2Many (Ich füge param Namen, die Situation klarer zu erklären):

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

Mit diesem Code Sie Odoo sagen, dass es ein Many2one Feld mit dem Namen id in employee.line Modell, das auf employee.as.product Modell zeigt. Natürlich gibt es ein id Feld in employee.line Modell, aber es ist keine ID von employee.as.product überhaupt. Dies ist der Schlüssel jedes Datensatzes, der standardmäßig in jedem Modell erstellt wird (in diesem Fall employee.line). Sie können ihn also nicht als inverse_name des One2many festlegen.

Was Sie wollen, ist dies:

erstellen Many2one Feld in employee.line Modell:

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

Korrigieren Sie Ihre One2Many Feld in employee.as.product Modell auf diese Weise:

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

Und das One2many-Feld wird wie erwartet funktionieren ted.

Verwandte Themen