【问题标题】:How to prevent field value repetition on already assigned date in Odoo?如何防止 Odoo 中已分配日期的字段值重复?
【发布时间】:2017-12-28 11:43:29
【问题描述】:

我正在使用 Odoo 10。

我有一个 one2many 字段,在 hr.employee 模型中有两列。如果“奖金”字段(many2one 字段)分配给特定日期,则不应在同一日期再次保存或重复。

如何做到这一点?

【问题讨论】:

  • 你能解释一下吗?
  • 看一下我现在添加的截图
  • 你可以使用python约束函数。
  • 怎么样?你能告诉我怎么做吗?一个例子会有帮助@EmiproTechnologiesPvt.Ltd.

标签: python python-2.7 date odoo-10 odoo


【解决方案1】:

看看下面的代码,这是一种可能的解决方案,不是最好的。

from odoo import models, fields, api
from odoo.exceptions import ValidationError

class HrEmployee(models.Model):
    _inherit = 'hr.employee'

    prod_details_ids = fields.One2many(
        string=u'Product details',
        comodel_name='prod.details',
        inverse_name='employee_id',
    )

class ProdDetails(models.Model):
    _name = 'prod.details'

    employee_id = fields.Many2one(
        string=u'Employee',
        comodel_name='hr.employee',
    )

    date = fields.Date(
        string=u'Date',
        default=fields.Date.context_today,
    )

    bonus_id = fields.Many2one(
        string=u'Bonus',
        comodel_name='res.partner',  # just an example
    )

然后你需要添加约束:

解决方案 1

    _sql_constraints = [
        ('bonus_unique', 'unique(employee_id, date, bonus_id)',
         _('Date + Bonus cannot be repeated in one employee!')),
    ]

解决方案 2

    @api.one
    @api.constrains('date', 'bonus_id')
    def _check_unique_date(self):

        # you have more freedom here if you want to check more things

        rest = self.employee_id.prod_details_ids - self
        for record in rest:
            if record.date == self.date and record.bonus_id.id == self.bonus_id.id:
                    raise ValidationError("Date + Bonus already exists and violates unique field constraint")

注意:如果您的数据库中已有日期,请确保可以使用此数据添加约束,因为如果没有,则无法将约束添加到数据库中。 _sql_constraints 至少会发生这种情况

【讨论】:

  • 它不能满足我的需求@ChesuCR
  • 也许您并不完全需要我编写的代码,但您需要该工具来构建约束。你能写下你的代码让我更具体吗@naveen?
  • @Naveen 我已经用两种可能的解决方案更新了我的答案,检查它们是否对你有用
【解决方案2】:

使用约束停止创建另一个同名记录,因此不会发生重复记录。

【讨论】:

    【解决方案3】:

    您可以使用约束和 search_count() 方法来检查是否有记录。如下所示

    @api.constraints('date')
    def validate_date(self):
        result = self.search_count([your_domain])
        if result:
            raise ValidationError(_('Your Text'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      相关资源
      最近更新 更多