2016-06-07 5 views
0

В счете-фактуре клиента в модуле счета есть one2many поле,Как извлечь значения из one2many поля в odoo

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

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

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

+0

от чего вы хотите получить эти идентификаторы продуктов? – qvpham

+0

С помощью этого поля мы будем сохранять продукты. Из этого продукта я хочу идентификатор продукта –

+0

Я не понимаю, как вы хотите его использовать. Но это поле создает отношение к 'account.invoice.line'. В 'account.invoice.line' есть отношение к' product.product'. Поэтому вам нужно получить объект 'account.invoice.line' с помощью этого' invoice_id' и получить его данные. В этих данных есть поле 'product_id' – qvpham

ответ

4

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

В модели 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

Смежные вопросы