在我的模块中,我不得不在大多数具有auto = true的模型中使用many2one字段,因此在数据库中创建的fk太多,因此,此fks导致循环引用问题,而这的真正问题是非常缓慢且几个用户在工作时,我的问题是,如果有人可以帮助我解决这个问题,我将不胜感激。 预先感谢
我试图减少many2one字段,但无法解决问题
答案 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()
方法将阻止您的层次结构无限循环。