odoo one2many 默认未设置

Posted

技术标签:

【中文标题】odoo one2many 默认未设置【英文标题】:odoo one2many default not set 【发布时间】:2015-07-24 10:16:55 【问题描述】:

我编写了一个向导,表单视图应该显示 one2many 字段,其中行取自 context['active_ids']。

我正确设置了 one2many 默认值,但是当表单打开时,没有显示任何行。

我错过了什么吗? (对于代码缩进错误,我深表歉意)

class delivery_wizard(models.TransientModel):
_name = 'as.delivery.wizard'

address = fields.Many2one('res.partner')
details = fields.One2many('as.delivery.detail.wizard', 'delivery')
carrier = fields.Many2one('delivery.carrier')

@api.model
def default_get(self, fields_list):
    res = models.TransientModel.default_get(self, fields_list)
    ids = self.env.context.get('active_ids', [])
    details = self.env['as.delivery.detail'].browse(ids)
    dwz = self.env['as.delivery.detail.wizard']
    dws = []
    for detail in details:
        dw = dwz.create(
            'production': detail.production_id.id,
            'quantity': detail.quantity,
            'actual_quantity': detail.quantity,
            'enabled': detail.production_id.state == 'done',
            'delivery': self.id,
        )
        dws.append(dw.id)

    res['details'] = [(6, False, dws)]
    res['address'] = details[0].delivery_id.address_id.id
    return res

class delivery_detail_wizard(models.TransientModel):
    _name = 'as.delivery.detail.wizard'

    production = fields.Many2one('as.production')
    quantity = fields.Float()
    actual_quantity = fields.Float()
    force = fields.Boolean()
    enabled = fields.Boolean()
    delivery = fields.Many2one('as.delivery.wizard')

【问题讨论】:

您确定要在 default_get 中使用 self.id 吗?我敢打赌,该对象还没有 id。我认为 id 是在创建对象之后出现的。为了创建对象,您需要默认值。我错过了什么? 【参考方案1】:

问题可能就在那里:

res['details'] = **[(6, False, dws)]**

您的详细信息字段是 One2many 字段,[(6,0, [IDS])] 用于 Many2many。 在您的情况下,您不需要为详细信息字段分配任何内容;它是 One2many,所以它是自动的,因为您已经创建了相应的 Many2one 记录 (dw)。

Little reminder from the doc:

对于多对多

对于 many2many 字段,需要一个元组列表。这是清单 被接受的元组,具有相应的语义

(0, 0, values ) 链接到需要创建的新记录 使用给定的值字典

(1, ID, values ) 用 id = ID 更新链接记录(写 就可以了)

(2, ID) 移除并删除 id = 的链接记录 ID(在 ID 上调用 unlink,这将完全删除对象,并且 还有链接)

(3, ID) 切断与 id = ID 的链接记录的链接 (删除两个对象的关系但不删除 目标对象本身)

(4, ID) 链接到 id = ID 的现有记录(添加一个 关系)

(5) 取消所有链接(例如对所有链接使用 (3,ID) 记录)

(6, 0, [IDs]) 替换链接 ID 列表(如使用 (5) 然后 (4,ID) 对于 ID 列表中的每个 ID)

示例:[(6, 0, [8, 5, 6, 4])] 将 many2many 设置为 ids [8, 5, 6, 4]

还有 One2many:

(0, 0, values ) 链接到需要创建的新记录 使用给定的值字典

(1, ID, values ) 用 id = ID 更新链接记录(写 就可以了)

(2, ID) 移除并删除 id = 的链接记录 ID(在 ID 上调用 unlink,这将完全删除对象,并且 还有链接)

示例:[(0, 0, 'field_name':field_value_record1, ...), (0, 0, 'field_name':field_value_record2, ...)]

此外,如果您希望其他人易于理解您的代码,请尝试关注 odoo guidelines 获取 Many2One/One2many 字段:

One2Many 和 Many2Many 字段应始终以 _ids 作为后缀(例如:sale_order_line_ids)

Many2One 字段应以 _id 作为后缀(例如:partner_id、user_id、...)

【讨论】:

我尝试使用 res['details'] = [(0, 0, dws)] 和 dws 一个 dict 数组,但后来我意识到我只需要 res['details'] = dws.关于指南,您是对的,但是对于新的 API 8 恕我直言,这应该不再需要,因为“ids”不仅仅是数字,而是整个对象。例如,符号 object_id.id 是多余的。它可能具有向后兼容性的意义...... 我同意它现在感觉有点过时了,但是,object_record / object_records 似乎有点冗长,不是吗? ;) 也许他们将来会指向像 object_rd / object_rds 这样的东西,谁知道呢。 看来你不需要'delivery':self.id 实际上self.id==False 在那一刻你已经意识到你只需要res['details'] = dws 那里是一种魔术,在插入父对象后,将“交付”字段分配给带有 self.id 的子实体。

以上是关于odoo one2many 默认未设置的主要内容,如果未能解决你的问题,请参考以下文章

one2many 的域不工作 Odoo

Odoo 防止在 One2many 字段中选择重复记录

One2many 字段显示 Odoo13 中的空条目/记录

如何在 odoo 14 中取消缩小 one2many 树视图的列标题?

如何在 set_values 方法 odoo 14 中保存 one2many 字段

Odoo:如何显示 one2many 字段中的 many2one 字段的字段