如何根据在另一个模型中的 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.rescuee
、otl.qrcode
和 otl.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.rescuee
和 otl.qrcode
共享 many2many
关系(即分别为 qr_ids
和 rescuee_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 字段中添加或删除数据自动在模型中创建记录的主要内容,如果未能解决你的问题,请参考以下文章
在Odoo中的Many2Many字段插入请求在android中不起作用