如何根据在另一个模型中的 Many2many 字段中添加或删除数据自动在模型中创建记录

Posted

技术标签:

【中文标题】如何根据在另一个模型中的 Many2many 字段中添加或删除数据自动在模型中创建记录【英文标题】:How to automatically create a record in a model based on addition or deletion of data in a Many2many field in another model 【发布时间】:2021-07-18 12:07:42 【问题描述】:

我有三个模型 - otl.rescueeotl.qrcodeotl.qrcode.history

otl.rescuee 中使用的字段是:

class OtlRescuee(models.Model):
_name = 'otl.rescuee'
_inherit = ['image.mixin']
_description = "Rescuee"

name = fields.Char("Name", readonly=True)
address =  fields.Text(string="Address")
firstname = fields.Char("First Name")
lastname = fields.Char("Last Name")
nick_name = fields.Char("Preferred Name")
birth_date = fields.Date(string="Date of Birth")
caregiver_id = fields.Many2one('res.users', string="Caregiver")
support_cast_ids = fields.Many2many('res.partner', 'support_cast_rescuee_rel', 'support_cast_id', 'rescuee_id', string="Support Cast")
qr_ids = fields.Many2many('otl.qrcode', 'qrcode_rescuee_rel', 'rescuee_id', 'qrcode_id',  string='QR Codes')

otl.qrcode中用到的字段有:

class OtlQrcodeCreation(models.Model):
_name = 'otl.qrcode'
_inherit = ['image.mixin']
_description = "QR code"

name = fields.Char(string='QR Code')
description = fields.Text(string="Description")
rescuee_ids = fields.Many2many('otl.rescuee', 'qrcode_rescuee_rel', 'qrcode_id', 'rescuee_id', string='Rescuees')
active = fields.Boolean(string='Active', default=True)

同样otl.qrcode.history由以下给出:

class OtlQrcodeHistory(models.Model):
_name = 'otl.qrcode.history'
_description = "QR Code History"

name = fields.Char(string="QR History", readonly=True, required=True, copy=False, default='New')
rescuee_id = fields.Many2one('otl.rescuee', string='Rescuee')
qrcode_id = fields.Many2one('otl.qrcode', string='QR Code')
start_date = fields.Date(string='Start Date')
end_date = fields.Date(string='End Date')

如您所见,otl.rescueeotl.qrcode 共享 many2many 关系(即分别为 qr_idsrescuee_ids)。 otl.qrcode 模型用于创建 qrcodes,以后可以将其作为标签添加到 otl.rescuee qr_ids 字段中。

那么,如何根据qr_ids 字段上数据的添加/删除自动在otl.qrcode.history 中创建记录,start_date 是添加该特定记录的日期,end_date 是该记录被删除的日期。谢谢!

【问题讨论】:

【参考方案1】:

在二维码模型中,实现create和unlink方法。因此,当第一次创建二维码时,会自动创建二维码历史对象,并将当前日期作为开始日期。关于在 qr_ids 上添加数据,您可以在 qrcode 模型中创建一个 write 方法并将您的逻辑放在那里。

history_id = fields.One2many('otl.qrcode.history', 'qrcode_id', 'History')

@api.model
def create(self, value):
    history_id = self.env['otl.qrcode.history'].create(
            'name': 'name qr',
            'rescuee_id': rescuee_id,
            'start_date': fields.Date.today(),
            'end_date': None,
            'qr_id': self.id,
            )
    value['history_id'] = history_id
    new_qr_id = super(OtlQrcodeCreation, self).create(values)
    return super(OtlQrcodeCreation, self).write('qr_id': new_qr_id)

@api.model
def unlink(self):
    self.history_id.write('end_date': fields.Date.today())
    return super(OtlQrcodeCreation, self).unlink()

在 PosgreSQL Odoo 中,每个模型都有 create_date 和 write_date。您可以按照自己的方式使用 write_date。

【讨论】:

以上是关于如何根据在另一个模型中的 Many2many 字段中添加或删除数据自动在模型中创建记录的主要内容,如果未能解决你的问题,请参考以下文章

Domain 表达式的用法

在Odoo中的Many2Many字段插入请求在android中不起作用

doamin 过滤条件

odoo many2one或many2many字段动态domain的两种方法

many2many 字段上的 Odoo 特定表单视图

如何从gorm中的many2many表中获取对象