Поле one2many хранит только последнюю запись при заполнении - PullRequest
1 голос
/ 29 апреля 2020

, пожалуйста, помогите мне относительно поля one2many в odoo12. во-первых, извините за плохую грамматику.

Я получаю продукты из invoice_line_ids модели account.invoice. но когда я храню эти продукты в моей пользовательской модели, в моем классе сохраняется только последняя запись в поле one2many. вот мой код.

invoice_report = self.create(vals)
product_dict={}
product_list=[]

for line in ids.invoice_line_ids:
    product_dict.update({
        'product_name':line.product_id.name,
        'qty':line.quantity,
        'unit_price':line.price_unit,
        'tax':line.invoice_line_tax_ids.name or "",
        'subtotal':line.price_subtotal
    })

    product_list.append([(1,invoice_report.id,product_dict)])

for data in product_list:
    invoice_report.write({
        'inv_products':data
    })

inv_products - мое поле one2many invoice_report - моя недавно созданная запись. то есть custom.invoice (1,)

1 Ответ

1 голос
/ 29 апреля 2020

Согласно значению x2many, заполняющему , используемый вами формат обновляет существующую запись id id со значениями в values. id должен быть идентификатором записи inv_products, а не custom.invoice записи.

Вы должны получить сообщение об ошибке сервера Odoo, если запись с идентификатором, равным 1, не существует в базе данных :

One of the records you are trying to modify has already been deleted (Document type: custom.report.line).

(Records: (1,), User: 2) 

Вы объявили product_dict вне a для l oop и использовали update внутри, в конце l oop у вас будут значения последней строки invoice_line_ids повторяется, вы попросили систему обновить указанную строку c (с идентификатором invoice_report.id) с теми же значениями в каждой итерации, когда вы вызывали метод write.

Чтобы добавить новые записи в inv_products, используйте [(0, 0, values)] формат:

invoice_report = self.create(vals)
product_list = []

for line in ids.invoice_line_ids:
    product_dict = {

    }

    product_list.append((0, 0, product_dict))

invoice_report.write({
    'inv_products': product_list
})
...