【问题标题】:Inherited model many2one picking a wrong field value继承模型 many2one 选择了错误的字段值
【发布时间】:2017-04-25 12:52:27
【问题描述】:

我试图在我继承的模型(plot.allocate)中引用 formdownload 模型的 form_serial_no 字段。而不是显示 form_serial_no 的计算值的下拉列表,它是用序列填充的 company_short_code,例如 CCK0000006,它显示的是“CCK”,它是 company_short_code 的值,不包括序列。实际上,它引用的是companyname模型的company_short_code,而不是formdownload模型的form_serial_no的计算值。在数据库中,form_serial_no 字段显示正确的记录,类似于这些......ABC0000008,CDG0000003 等等。这是我的问题,有什么理由为什么 plot.allocate 模型的 form_serial_no_id Many2one 字段没有选择 formdownload 的 form_serial_no Char 字段的值,而是选择 companyname 模型的 company_short_code Char 字段?

其次,当在 plot.allocate 模型的 form_serial_no_id Many2one 字段中选取一个值时,如何将 companyname 模型记录的状态字段默认值更改为 true?

请帮我看看这些。

下面是我的代码sn-p

    # -*- 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)

【问题讨论】:

  • 当您创建记录时,您没有任何错误,例如 Keyerror : name ?因为你在问 vals 是否包含 name
  • 不,我没有 keyerror。

标签: openerp odoo-8 odoo-9 odoo-10


【解决方案1】:

在视图中,many2one 始终显示 _rec_name 在 Model 类中指定的字段的值:

默认_rec_name = 'name'

所以实际上你的模型是这样的:

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

所以他将检索字段 name 的值,名称也是 many2one,所以检索到的值是模型 companyname_rec_namecompany_short_code

所以我想更改 many2one 的值,你必须选择:

如果一个字段就足够了,请指定_rec_name = 'form_serial_no'

如果你想组合像 first && last name 这样的值,那么覆盖 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

编辑

在create方法中很简单,只需删除create方法中的所有代码并放入这两行

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

【讨论】:

  • 如果您不明白我在说什么,请告诉我
  • 感谢您的回复。真的很有帮助…………我用这个回答解决了第一个问题…………现在,第二个问题?
  • 所以当您在 m2o 字段中选择一个值时,默认状态为 false,您希望与此记录相关的公司名称具有 status = true。如果从该公司 status = true 中选择了至少一条记录,那么您所说的 true 是什么意思?并至少为解决你的第一个问题和我花费超过 5 分钟的信息投票。
  • 什么也没发生,但是你问的好需要一些时间你需要覆盖最后一个方法的 create && write 或在你的第一个模型中创建 one2many 关系来计算状态的值。如果您无法放置您尝试过的代码,请尝试处理它,我们将为您提供帮助
  • 已经这样做了,我会在几分钟内回复您。感谢您的回复,我真的很感激。
猜你喜欢
  • 2015-08-02
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多