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

Generating a sequence using a field value of other class in the same model file

我正在尝试创建一个序列,该序列将在单击保存按钮时出现在表单下载模型的 form_serial_no 字段中。此 form_serial_no 字段将在同一 models.py 文件中选择公司名称模型的 company_short_code 字段,并用七 (7) 位数字填充它,例如 CHN0000001,其中 CHN 是 [=26= 的值] 字段和 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>

当我检查表单下载 table 时,没有为 form_serial_no 字段创建记录。请帮我调查一下。

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

  1. 通过代码获取

    name=self.env['ir.sequence'].get('formdownload.form_serial_no')
    
  2. 通过 Id 获取

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

在您的 xml 文件中代码是 formdownload.form_serial_no

<field name="code">formdownload.form_serial_no</field>

您使用了错误的代码来获取序列,因此您没有得到正确的结果。

这可能对您有所帮助。

@Emipro Technologies 的回答实际上应该对你有用,因为你弄错了序列码。

我怀疑它不起作用的原因有两个:

  1. 您尚未在 __openerp__.py 文件中包含 sequences.xml,因此请致电 name=self.env['ir.sequence'].get('formdownload.form_serial_no') 将 return False 因为序列不存在。换句话说,检查 "Sequences & identifiers => Sequences" 它是否真的存在于数据库中。

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

其他一些建议。

我看到您正在尝试创建一个动态字段来选择公司短代码并将其附加到序列,序列前缀采用固定值并且不能是动态的,这是唯一的方法动态序列 AFAIK 是在这样的创建方法中执行的:

@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 是否有任何价值。它总是在创建方法中设置。所以额外的检查在这里没有用。