2017-04-25 68 views
0

我想引用我继承的模型(plot.allocate)formdownload模型form_serial_no领域。不用下拉菜单来显示form_serial_no的计算值,该值是用序列填充的company_short_code,例如CCK0000006,它显示“CCK”,它是不包括序列的company_short_code的值。实际上,它引用的是公司名称模型的company_short_code,而不是formdownload模型的form_serial_no的计算值。而在数据库中,form_serial_no字段显示的是正确的记录,类似于...... ABC0000008,CDG0000003等等。这是我的问题,是否有任何理由为什么form_serial_no_id plot.allocate模型的Many2one字段没有选择form_serial_no formdownload的Char字段的值,而是选择companyname模型的company_short_code Char字段?继承模型many2one选择了错误的字段值

其次,如何更改公司名称模型记录的真状态字段默认值,当值plot.allocate模型form_serial_no_id Many2one场挑?

请帮我看看这些。

下面是我的代码段

# -*- coding: utf-8 -*- 

from openerp import models, fields, api 

class CompanyName(models.Model): 
    _name = 'companyname' 
    _rec_name = 'company_short_code' 

    company_name = fields.Char(string="Company Name", required=True) 
    company_short_code = fields.Char(string="Company short code", required=True) 

class FormDownload(models.Model): 
    _name = 'formdownload' 
    _rec_name = 'form_serial_no' 

    name = fields.Many2one('companyname', string="Company Name", ondelete='cascade', 
             required=True) 
    form_serial_no = fields.Char(string="Form Serial No", readonly=True) 
    status = fields.Boolean(string="Status", default=False) 

    @api.model 
    def create(self, vals): 

     serial_no = self.env['ir.sequence'].get('formdownload.form_serial_no') 
     code = self.env['companyname'].browse(vals['name']).company_short_code 

     # capitalize company short code values 
     code = code.upper() 

     # merge code and serial number 
     vals['form_serial_no'] = code + serial_no 
     return super(FormDownload, self).create(vals) 

class PlotAllocation(models.Model): 
    _inherit = 'plot.allocate' 

    form_serial_no_id = fields.Many2one('formdownload', 
             domain=[('status', '=', False)], 
             ondelete='cascade', string="Form Serial No") 

    @api.model 
    def create(self, vals): 
     record = self.env['formdownload'].search([('name', 'like', vals.get('name', False))]).form_serial_no 
     status = self.env['companyname'].search([('name', 'like', vals.get('name', False))]).status 
     if vals.get('form_serial_no_id') == record.id: 
      self.env['companyname'].write({status : True}) 

      return super(PlotAllocation, self).create(vals) 
+0

:名称 ?因为你在问vals是否包含'name' – Cherif

+0

不,我没有keyerror。 – John

回答

0

在视图中many2one总是示出在模型类中指定的字段的值由_rec_name

默认_rec_name = 'name'

所以在现实中你的模型是这样的:

class FormDownload(models.Model): 
     _name = 'formdownload' 
     _rec_name = 'name' 

所以他会retreive字段的值name名称也是many2one因此检索到的值与模型companyname_rec_namecompany_short_code

,所以我要改变,你必须选择的many2one的价值:

如果一个字段是不是够指定_rec_name = 'form_serial_no'

如果你要像第一& &姓氏总价值则覆盖name_get方法

@api.multi 
def name_get(self): 
    """ 
     change the displayed value on m2o 
    """ 
    result = [] 
    for record in self: 
     result.append((record.id, _(" %s %s") % (record.first_name, record.last_name))) 
    return result 

编辑

在创建方法很容易只是删除所有的代码创建方法,当你创建你不必像KeyError异常任何错误记录把这两个线路

rec_id = super(PlotAllocation, self).create(vals) 
# create return a record you can acces it's value 
rec_id.form_serial_no_id.name.status = True 
return rec_id # you need to return the record 
+0

让我知道如果你不明白我在说什么 – Cherif

+0

感谢您的回复。这真的很有用.........我能用这个回答解决第一个问题........现在,第二个问题? – John

+0

因此,当您在m2o字段中选择一个值时,默认状态为false,您希望与此记录相关的公司名具有status = true。 如果至少有一条记录从该公司status = true中选择,那么您的意思是true?并至少投票解决你的第一个问题和信息,我花了超过5分钟。 – Cherif