2017-09-04 2 views
2

Angenommen, ich habe:Summe zwei Float Felder aus zwei Modellen, auf der gleichen Form - Odoo v8

class Model1(models.Model): 

    name = fields.Char(string="Name") 
    one_1 = fields.One2many('Model2', 'field_many', string="") 
    one_2 = fields.One2many('Model3', 'field_many2', string="") 
    one_3 = fields.One2many('Model4', 'field_many3', string="") 

Dies sind die von One2many Felder genannt Modelle:

class Model2(models.Model): 
    field_many = fields.Many2one('Model1', string="") 
    field_float1 = fields.Float() 

class Model3(models.Model): 
    field_many2 = fields.Many2one('Model1', string="") 
    field_float2 = fields.Float() 

class Model4(models.Model): 
    field_many3 = fields.Many2one('Model1', string="") 
    field_float3 = fields.Float() 

I field_float1 fassen müssen und field_float2 und zeigen das Ergebnis auf field_float3, aber das Problem ist, oder was mich verwirrt für das, was zählt, ist die Tatsache, dass diese Summe nicht nur eine Summe im selben Modell ist.

ich tun kann:

@api.onchange('field_float1', 'field_float2') 
def _compute_amount_move_sales_current(self): 
    if self.field_float1 or self.field_float2: 
     self.field_float3 = self.field_float1 + self.field_float2 

Aber das sind Felder aus zwei Modellen, das Ergebnis sollte auch auf dem dritten Modellfeld reflektiert wird, werden diese Modelle auf Model1 Form dargestellt, durch 3 One2many Baumansicht oder Linien, wie sie oft in Odoo genannt werden.

Also, es ist nur um die ersten beiden Felder zu lesen, aber es muss auf dem Formular Model1 sein, die den neuen Datensatz erstellen wird. Nicht die db-Tabelle.

EDIT

Dies ist eine genauere Erklärung, ein Benutzer erstellt einen neuen Datensatz mit diesen Zeilen oder One2many Felder, in allen Fällen die ersten beiden gefüllt werden muss, so denke ich, dass mit required=True erreicht werden Flagge auf den Feldern. Allerdings habe ich versucht, auf diese Weise:

class Model1(models.Model): 

    name = fields.Char(string="Name") 
    one_1 = fields.One2many('Model2', 'field_many', string="") 
    one_2 = fields.One2many('Model3', 'field_many2', string="") 
    one_3 = fields.One2many('Model4', 'field_many3', string="", onchange="compute_sum") 
    @api.onchange('one_1', 'one_2') 
    def compute_sum(self): 
     if self.one_1.field_float1 or self.one_2.field_float2: 
     self.one_3.field_float3 = self.one_1.field_float1 + self.one_2.field_float2 

Aber es funktioniert nicht, wenn ich einen der field_float es erforderlich, füllen sagt:

ValueError 

Expected singleton: Model4() 

Zur weiteren Erläuterung sind die Modelle aussehen dies:

class Model2(models.Model): 
    field_many = fields.Many2one('Model1', string="") 
    field_float1 = fields.Float() 
    field_float_ = fields.Float() 
    field_integer = fields.Integer() 
    field_char = fields.Char() 

class Model3(models.Model): 
    field_many2 = fields.Many2one('Model1', string="") 
    field_float2 = fields.Float() 
    integer = fields.Integer() 

class Model4(models.Model): 
    field_many3 = fields.Many2one('Model1', string="") 
    field_float3 = fields.Float() 
    chars = fields.Char() 
    bool = fields.Boolean() 

ich meine, gibt es mehrere Felder auf jedem dieser Modelle, die von Model1 mit One2many Felder genannt werden, nur diese Schwimmer brauchen die Operation, nicht jeder von ihnen.

Und der Benutzer füllt diese Felder in der Reihenfolge, mit einem state wie Formular, mit statusbar etc, um.

Antwort

2

Diese Lösung arbeiten möchten, wenn Sie

field1 of record1 In first one2many field with field2 of record1 In second one2many field to put the the result in field3 of the first record. 

Es ist ein Anfang zu verstehen, was Sie genau brauchen summieren. In Ihrem model1 makr dritten one2many Feld ein Rechenfeld

    @api.depends ('one_1', 'one_2','one_1.field1', 'one_2.field2') 
        def compute_sum(self): 
          # Then loop throw your records and compute sum 

ich mehr cde schreiben würde für Sie, aber ich bin mein Telefon i meine Antwort später zumindest erhalten Sie die Idee hoffen bearbeiten kann.

Wenn Sie onchange verwenden, funktioniert es möglicherweise auch, wenn Benutzer den Wert des float-Felds ändern, aber one_1.field1 entfernen, wenn Sie es verwenden.

Denken Sie daran, Sie müssen die Methode in yout model1 definieren becausr es dort ist, wo Sie vollen Zugang

+1

danken Ihnen sehr viel haben, ich muss versuchen, einige Tests – NeoVe

+0

Hallo zu tun, aber jetzt ist die ganze Linie ist nur lesbar, ich meine, , Ich habe nur ein Feld in dem Beispiel verwendet, weil es ein Beispiel war, es ist in gewissem Umfang so, aber es gibt auch einige andere Felder auf diesem One2many, die nicht berechnet werden sollten, das ist das Problem, denke ich – NeoVe

+0

Stellen Sie sich vor Beispiel, mit 2 anderen Feldern, die nicht berechnet werden sollten, Idk, wenn ich meine Frage dafür bearbeiten sollte, Ihre Lösung denke ich, funktioniert nur, wenn ich buchstäblich ein Feld auf "one_3" habe – NeoVe

Verwandte Themen