1

这是我的结构:

class Imprint_Location(models.Model):
    _name = 'imprint.location'

    name = fields.Char()
    product_id = fields.Many2one('product.template')

class Imprint_Charges(models.Model):
    _name = 'imprint.charge'
    _rec_name = 'location_id'

    product_id_c = fields.Many2one('product.template', required=True)
    location_id = fields.Many2one('imprint.location', required=True)
    @api.multi
    @api.onchange('product_id_c', 'location_id')
    def product_filter(self):
        res = {}
        print '\n\n-------\n\n', self, self.product_id_c, '\n\n-------\n\n'
        if self.product_id_c:
            res['domain'] = {'location_id': [('product_id', '=', self.product_id_c.id)]}
            print res
        return res

class Product_Template(models.Model):
    _inherit = 'product.template'

    imprint_location_ids = fields.One2many('imprint.location', 'product_id')
    sale_imprint_charge_ids = fields.One2many('imprint.charge', 'product_id_c')

现在我已经在页面中定义了一个页面,并且product.template我没有选择该字段[此字段也没有显示在定义的树中]。sale_imprint_charge_ids<tree editable="bottom">product_id_c

现在我的问题是,当我从我imprint.charge为该方法定义的表单视图中选择它时product_filter工作正常,但是当我从那里输入时,product.template我得到一个错误说

TypeError: <odoo.models.NewId object at 0x7fbb8bc21b90> is not JSON serializable

因为 from product.templateif 传递了 object <odoo.models.NewId object at 0x7fbb8bc21b90>,所以如果 printself.product_id_c然后它打印product.template(<odoo.models.NewId object at 0x7fbb8bc21b90>),所以这是不可序列化的。我试过这样做self.product_id_c.ids给输出空列表[]

那么如何product.template从对象中获取 id 或传递id自身覆盖某些方法。

4

2 回答 2

1

当创建一个全新的记录时,Odoo 会创建那个奇怪的<odoo.models.NewId object at 0x7fbb8bc21b90>对象。在你写完记录后,这个 id 会变成你习惯的普通 id(一个整数)。在这种情况下,您有一个函数(并非不合理地)在实际不存在这样的值时期望一个真实的 id 值。您需要提供后备,例如评估 id 是否为整数并在这种情况下提供替代值。尽管您的函数似乎返回了一个对象,但我不太清楚您期望发生什么。如果您希望修改其中一个字段的值,我会修改 self 对象的值,而不是返回一个对象。

于 2016-11-15T15:19:17.703 回答
1

您应该改进以下几点。

  • res['domain'] = {'location_id': [('product_id', '=', self.product_id_c.id)]}
  • 返回资源
  • 学习一些ORM 的search()方法

尝试使用以下代码:

@api.multi
@api.onchange('product_id_c', 'location_id')
def product_filter(self):
    res = {}
    if self.product_id_c:

        self.location_id = False

        #search product_template in imprint.locationwith table and limit we will get only record if related record found
        location_id = self.env['imprint.location'].search([('product_id', '=', self.product_id_c.id)], limit=1)

        if location_id:

            #location_id.ids will give you something like [2] so we need to set value as 2
            self.location_id =  location_id.ids[0]

编辑:

根据您的第一条评论,您需要一个相关位置的列表,然后我们应该遵循技巧。

  • 删除product_filter()方法
  • 在imprint.charge对象视图文件中添加域

例如:

<field name="location_id" domain="[('product_id', '=', product_id_c)]"/>

之后,重新启动 Odoo 服务器并升级您的自定义模块。

于 2016-11-15T15:19:41.320 回答