Как получить значения из поля 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