连接Odoo v9上的字段

时间:2017-03-27 15:20:03

标签: openerp odoo-9

我尝试连接3个字段以形成内部代码并在视图中显示:

我有3个型号:

  • 类别(尺寸= 2)
  • 产品(尺寸= 4)
  • Serie(size = 3)

我希望以这样的形式显示它

产品代码:CAT-PROD-001

我不知道是否必须使用计算字段或者是否存在其他方法来执行此操作,因为我正在使用计算字段进行测试但无法达到所需的输出。

修改

现在我尝试使用带有onchange函数的计算字段来生成字段上的值

MODEL

# -*- coding:utf-8 -*-
from openerp import models,fields,api
class exec_modl(models.Model):
        _name           =   "exec.modl"
        _rec_name       =   "exec_desc"
        exec_code       =   fields.Char('Identificador',required=True,size=3)
        exec_desc       =   fields.Char('Descripción',required=True)
        cour_exec       =   fields.Many2one('cour.modl')
        proc_exec       =   fields.Many2one('enro.modl')
        inte_code       =   fields.Char(compute='_onchange_proc')

功能

  @api.onchange('proc_exec')
    def _onchange_proc(self):
        cate    =   "XX"
        cour    =   "XXXX"
        exet    =   "XXX"
        output  =   cate+"-"+cour+"-"+exet
        return output

我只是尝试使用普通值来了解如何将其发送到现场。

编辑2:

使用来自@Charif的答案我可以在表单上打印静态字符串,但是我想要触及的下一个里程碑是获取代码(外部模型字段)来创建 inte_code

例如:从模型cour.modl我想从第一个模型上的cour_exec字段对应的字段 cour_code(course_id for course)中获取值(cour_exec字段具有描述来自cour.modl模型的课程)

@api.depends('proc_exec')
        def _onchange_proc(self):
            cate    =   "XX"
            cour    =   self.env['cour.modl'].search([['cour_desc','=',self.cour_exec]])
            exet    =   "XXX"
            output  =   cate+"-"+cour+"-"+exet
            self.inte_code = output 

E @ api.depends(' inte_code')         def _onchange_proc(self):             cate =" XX"             #first domain使用tuple not list             cour_result = self.env [' cour.modl']。搜索([(' id',' =',exec_modl.cour_exec)])。cour_code             cour ="" #empty string,因为你不能用字符串值连接None或False             #if cour_result:             #cour ="," .join(cour_result.ids中crse_code的crse_code)             #else:             #print"搜索结果为空检查您的域名"             exet =" XXX"             输出= cate +" - " + cour +" - " + exet +" - " + cour_result             self.inte_code = output

编辑3

我一直试图使用调用其他模型值的搜索模式,但我有控制台输出:

无法适应类型' Many2One' ,似乎我试图比较2种不同类型的字段,可以解析类型奥多?或者我在搜索方法中使用了错误的语法?

   @api.depends('inte_code')
    def _onchange_proc(self):
        cate    =   "XX"
        # first domain use tuple not list
        cour_result    = self.env['cour.modl'].search([('id','=',exec_modl.cour_exec)]).cour_code

        exet    =   "XXX"
        output  =   cate+"-"+cour+"-"+exet+"-"+cour_result
        self.inte_code = output

编辑4:答案 最后,我使用以下代码达到了所需的输出!

@api.depends('inte_code')
        def _onchange_proc(self):
            cate_result    = self.cate_exec
            proc_result    =    self.env['enro.modl'].search([('id','=',str(self.proc_exec.id))]).enro_code
            cour_result    =    self.env['cour.modl'].search([('id','=',str(self.cour_exec.id))]).cour_code
            output  =   str(proc_result)+"-"+str(cate_result)+"-"+str(cour_result)+"-"+self.exec_code
            self.inte_code = output

另外,我添加了一个相关字段,用于将课程类别添加到最终输出中。

cate_exec       =   fields.Char(related='cour_exec.cour_cate.cate_code')
  

现在输出具有以下结构:

     

INTERNAL_PROC_ID-CAT_COURSE-COURSE-EXECUTION_CODE

     

EX:xxxxxxxx-xx-xxxx-xxx

2 个答案:

答案 0 :(得分:1)

您可以创建新向导。

从向导中,您可以生成内部参考。

class create_internal_reference(models.TransientModel):

    _name="create.internal.reference"

    @api.multi
    def create_internal_reference(self):
        product_obj=self.env['product.product']
        active_ids=self._context.get('active_ids')
        if active_ids:
            products=product_obj.browse(active_ids)
            products.generate_new_internal_reference()            
        return True

创建视图& act_window

<record model="ir.ui.view" id="create_internal_reference_1">
    <field name="name">Create Internal Reference</field>
    <field name="model">create.internal.reference</field>
    <field name="arch" type="xml">
            <form string="Create Internal Reference">
            <footer>
                <button name="create_internal_reference" string="Generate Internal Reference" type="object" class="oe_highlight"/>                  
                <button string="Cancel" class="oe_link" special="cancel" />
            </footer>
        </form>
    </field>
</record>

<act_window name="Generate Internal Reference" res_model="create.internal.reference"
src_model="product.product" view_mode="form" view_type="form"
target="new" multi="True" key2="client_action_multi"
id="action_create_internal_reference"
view_id="create_internal_reference_1"/>
class product_product(models.Model):

   _inherit='product.product'

    @api.multi  
    def generate_new_internal_reference(self):    
        for product in self:
            if not product.internal_reference:
                product.internal_reference='%s-%s-%s'%(str(product.categ_id.name)[:2],str(product.name)[:4],third_field[:3])

从更多按钮下的product.product,您可以访问此向导并生成内部参考。

这可能会对你有帮助。

答案 1 :(得分:1)

  1. 首先在计算领域使用api.depends而不是onchange:
  2. 其次,计算函数不会返回任何内容,但它会传递自变量上的记录,因此您所要做的就是将值分配给计算字段。

    @api.depends('proc_exec')
    def _onchange_proc(self):
        # compute the value 
        # ... 
        # Than assign it to the field
        self.computed_field =   computed_value
    
  3. 我建议做的一件事就是循环自我,因为它是recordSet所以如果self包含多个记录,那么前面的代码会引发signlton错误  所以你可以这样做:

    # compute the value here if it's the same for every record in self
    for rec in self :
         # compute the value here it depends on the value of the record 
         rec.compute_field = computeValue
    

    或使用带有api.depends的api.one

    @api.one
    @api.depends('field1', 'field2', ...)
    

    编辑:

            @api.depends('proc_exec')
        def _onchange_proc(self):
            cate    =   "XX"
            # first domain use tuple not list
            cour_result    =   self.env['cour.modl'].search([('cour_desc','=',self.cour_exec)])
            cour = "" # empty string because you cannot contcatenate None or False with a string value
            if cour_result : 
                cour = ",".join(id for id in cour_result.ids)
            else :
                print "result of search is empty check you domain"
            exet    =   "XXX"
            output  =   cate+"-"+cour+"-"+exet
            self.inte_code = output
    

    试试这段代码我认为搜索的结果是一个记录集,所以你可以通过name_of_record_set.ids获取id列表,而不是从id列表创建一个字符串来连接它试试让我知道是否有错误因为我正在使用工作PC我手上没有odoo ^^