使用同一模型文件中其他类的字段值生成序列

时间:2017-04-22 09:13:40

标签: openerp odoo-8 openerp-7 openerp-8

我正在尝试创建一个序列,该序列将在单击“保存”按钮时位于formdownload模型的form_serial_no字段上。此form_serial_no字段将在相同的models.py文件中选择companyname model的company_short_code字段,并用七(7)位数字填充它,例如CHN0000001,其中CHN是company_short_code字段的值,0000001是记录的第一个序列。 以下是我的代码片段:

models.py代码

class CompanyName(models.Model):

    _name = 'companyname'
    _rec_name = 'company_name'

    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'

    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):
        vals['form_serial_no'] = vals['name']
        if vals:
            vals['form_serial_no'] = self.env['ir.sequence'].get('formdownload')

            return super(FormDownload, self).create(vals)

sequences.xml代码

<?xml version="1.0" encoding="utf-8"?>
  <openerp>
     <data noupdate="1">
        <!-- Sequence for form download serial number -->
        <record id="ref_code_form_serial_no" model="ir.sequence.type">
          <field name="name">Sequence for form download serial number</field>
          <field name="code">formdownload.form_serial_no</field>
        </record>

        <record id="seq_form_serial_no" model="ir.sequence">
          <field name="name">Sequence for form download serial number</field>
          <field name="code">formdownload.form_serial_no</field>
          <field name="prefix">company_short_code</field>
          <field name="padding">7</field>
          <field name="company_id" eval="False"/>
         </record>
     </data>
  </openerp>

当我检查formdownload表时,没有为form_serial_no字段创建记录。请帮我看一下。

2 个答案:

答案 0 :(得分:2)

@Emipro Technologies答案实际上对您有用,因为您的序列代码错误。

我怀疑它无法正常工作的两个原因:

  1. 您的sequences.xml文件中未包含__openerp__.py,因此请致电 name=self.env['ir.sequence'].get('formdownload.form_serial_no')将返回False 因为序列不存在。换句话说,如果它确实存在于数据库中,请选中“序列和标识符=&gt;序列”。

  2. <data noupdate=" 1">更改为noupdate设置为1,这意味着存储在数据库中的xml一旦创建就永远不会更新,因此即使您更改了序列,它也不会更新,你会使用旧代码

  3. 其他一些建议。

    我可以看到你正在尝试创建一个动态字段,用于选择公司的短代码并将其附加到序列中。序列前缀采用固定值并且不能是动态的,这是获得动态序列的唯一方法AFAIK将在create方法中执行此操作:

    @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
    
        # merge code and serial number
        vals['form_serial_no'] = code + serial_no
    
        return super(FormDownload, self).create(vals)
    

    如果有任何值,您也无需检查vals。它总是在create方法中设置。所以额外的检查在这里没用。

答案 1 :(得分:0)

要获取序列,您需要传递代码或ID。

  1. 按代码获取

    public
  2. 获取ID

    name=self.env['ir.sequence'].get('formdownload.form_serial_no')
    
  3. 在您的xml文件中,代码为 formdownload.form_serial_no

    sequence_id=self.env.ref('module_name.ir_sequence_external_id').ids
    
    name=self.env['ir.sequence'].get_id(sequence_id[0])                                                        
    

    由于这个原因,您没有得到正确的结果,因此您输错了代码。

    这可能会对你有帮助。