如何解决和防止many2one字段成为odoo中的循环参考问题

时间:2019-02-17 15:53:54

标签: odoo

在我的模块中,我不得不在大多数具有auto = true的模型中使用many2one字段,因此在数据库中创建的fk太多,因此,此fks导致循环引用问题,而这的真正问题是非常缓慢且几个用户在工作时,我的问题是,如果有人可以帮助我解决这个问题,我将不胜感激。 预先感谢

我试图减少many2one字段,但无法解决问题

3 个答案:

答案 0 :(得分:2)

为了防止循环引用,您可以利用_check_recursion()帮助程序在Python约束内的记录的分层结构中检查循环引用,如果检测到循环,则会引发错误,例如:

@api.constrains('m2o_field')
def _check_m2o_field(self):
    if not self._check_recursion(parent='m2o_field'):
        raise exceptions.ValidationError(
            _('You cannot create recursive relationships.'))
如果检测到循环,

_check_recursion()将返回False。您可以将多对一字段的名称传递给_check_recursion(),否则将使用_parent_name类属性的值(即parent_id默认情况下。)

答案 1 :(得分:0)

您可以使用约束来检查是否有圆形。

   @api.constrains('your_field_id')
   def check_for_circular_fk(self):
        for rec in self:
            rec_ids = set()
            current_rec = rec
            while current_rec:
                 if current_rec.id in rec_ids:
                        raise your_error_here
                 else:
                       rec_ids.add(current_rec.id)
                       current_rec = current_rec.your_field_id

您可以更好地增强该方法,我认为显示严重的消息错误也很难^^

答案 2 :(得分:0)

要添加防止循环关系的检查,请将以下行添加到 型号:

@api.constrains('parent_id')
def _check_hierarchy(self):
  if not self._check_recursion():
  raise models.ValidationError(
  'Error! You cannot create recursive categories.')

如果不是默认的_check_recursion(),则应在parent_id中传递特定的many2one关系作为参数。 我使用models.ValidationError是因为我在Odoo-11环境中工作。但是_check_recursion()方法将阻止您的层次结构无限循环。