На ваш вопрос я могу дать вам общий ответ. Надеюсь, вы можете начать с этого.
В модели odoo (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 возвращает значение ID целевого объекта
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
от чего вы хотите получить эти идентификаторы продуктов? – qvpham
С помощью этого поля мы будем сохранять продукты. Из этого продукта я хочу идентификатор продукта –
Я не понимаю, как вы хотите его использовать. Но это поле создает отношение к 'account.invoice.line'. В 'account.invoice.line' есть отношение к' product.product'. Поэтому вам нужно получить объект 'account.invoice.line' с помощью этого' invoice_id' и получить его данные. В этих данных есть поле 'product_id' – qvpham