Как получить значения из поля one2many в odoo

В счете клиента в модуле аккаунта есть поле one2many,

invoice_line = fields.One2many('account.invoice.line', 'invoice_id', string='Invoice Lines')

Используя это поле, мы можем добавить несколько продуктов в счет. После добавления нескольких продуктов, как отделить эти продукты от этого поля, чтобы я получил идентификаторы продуктов.

Предположим, если мы сохраним два продукта, у нас будет две записи. Из этих двух записей мне нужно отделить идентификатор продукта каждого продукта.

1 ответ

Решение

На ваш вопрос я могу дать только общий ответ. Я надеюсь, вы можете начать с этого.

В оду модель (osv.osv,...) ты можешь использовать self.pool.get("model name") получить пул объектов для любой модели. С этим пулом вы можете использовать метод read() читать данные.
Модель Odoo хранится в основном в одной таблице в базе данных.

Во-первых, вам нужно понять взаимосвязь объектов в Odoo. В вашем случае это так:

account.invoice --(invoice_line_ids:one2many)--> account.invoice.line --(product:many2one)-> product
  • Чтение поля one2many возвращает list идентификаторов объектов назначения.
  • Чтение поля Many2one возвращает int значение идентификатора целевого объекта.

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

# call object pool for account.invoice
invoice_pool = self.pool.get("account.invoice")

# here you need the invoice_id to get the data. 
# you can get it by parsing the parameter context
found_invoices = invoice_pool.read(cr, uid, [invoice_id,], ["invoice_line_ids"], context)

# It returns a list, but i gave only one invoice_id.
# the list has maximun one element. we need the frist element
found_invoice = found_invoices[0] if found_invoices else None

invoice_line_ids = found_invoice["invoice_line_ids"]

# the same with "account.invoice.line"
invoice_line_pool = self.pool.get("account.invoice.line")
invoice_lines = invoice_line_pool.read(cr, uid, invoice_line_ids, ["product_id"], context)

# Here you have the product ids
# I don't need to get the first element, because it returns a int
product_ids = [line["product_id"] for line in invoice_lines]

cr, uid, context параметры, которые вы получаете из запроса. Вы можете получить его, переписав метод read, write.... Важно: вам нужно invoice_id начать. Вы можете получить это значение, анализируя переменную context,

Ты можешь использовать logging показать содержание context в файле журнала:

import logging

_logger = logging.getLogger(__name__)
_logger.info("context type: " + type(context))
_logger.info("context content: " + str(context))

P / S: Вам нужно будет настроить мой код, чтобы он соответствовал вашему, потому что я не знаю многих о вашей идее. Я работаю с Odoo 9. Но это в основном то же самое ядро ​​с Odoo 8

Другие вопросы по тегам