Odoo 仅当未选择任何字段时引发UserError

Odoo 仅当未选择任何字段时引发UserError,odoo,odoo-8,odoo-9,Odoo,Odoo 8,Odoo 9,我将我的自定义字段添加到res.partner模型中,当我创建partner时,如果选中了branch_id,我希望选择3个字段中的一个。如果未选择某些字段,则我想引发UserError 但现在,即使选择了其中一个字段,它也会引发UserError class ResPartner(models.Model): _继承='res.partner' branch_id=fields.manyOne('branch.responsibility','responsibility by branch'

我将我的自定义字段添加到res.partner模型中,当我创建partner时,如果选中了branch_id,我希望选择3个字段中的一个。如果未选择某些字段,则我想引发UserError

但现在,即使选择了其中一个字段,它也会引发UserError

class ResPartner(models.Model):
_继承='res.partner'
branch_id=fields.manyOne('branch.responsibility','responsibility by branch')
抽屉id=字段。多个1(
“家具.零件.类型”,string='Drawer type',
域=[('type','=','drawer')],)
flexible_id=fields.manyOne(
“家具.零件.类型”,string='Flexible type',
域=[('type','=','flexible')],)
runner_id=fields.manyOne(
“家具.零件.类型”,string='Runner type',
域=[('type','=','runner')],)
@api.model
def创建(自身、VAL):
如果VAL.get('branch_id'):
如果不是VAL['drawer\u id']或不是VAL['flexible\u id']或不是VAL['runner\u id']:
raise USERROR('您需要从笔记本raport数据中选择值')
返回超级(响应者、自我)。创建(VAL)
更新

对于write方法,我尝试了CZoellner建议的create方法,但对于
字段\u to\u check\u in\u vals

@api.multi
def写入(自身、VAL):
如果vals.get('branch_id')或vals.get('drawer_id')或vals.get('flexible_id')或vals.get('runner_id'),或
VAL.get('group_1_id')或VAL.get('group_2_id')或
VAL.get('group_3_id'):
字段\u-to\u-check=['drawer\u-id','flexible\u-id','runner\u-id','group\u-1\u-id','group\u-2\u-id','group\u-3\u-id']
字段\u到\u检查\u in\u vals=[f in self表示字段\u到\u检查中的f]
如果没有(字段到签入):
raise USERROR('如果选择了分支,则需要从data raport'中选择一个字段)
>返回超级(响应者、自我)。写入(VAL)

您的逻辑是,所有3个字段都必须设置。您可以在此处使用
any

if vals.get('branch_id'):
字段\u to \u check=['drawer\u id','flexible\u id','runner\u id']
字段\u-to\u-check\u-in\u-vals=[f-in-vals for f-in-fields\u-to\u-check]
如果没有(字段到签入):
raise USERROR()
编辑:
write
方法有点棘手。通常它是一种多记录方法,因此应该在self上实现for-each循环。然后,您需要使用
getattr
或只是(在Odoo文档中建议)将记录集视为dict。然后,可能是在写入调用时发生更改。因此,您必须检查持久值和新值:

对于self中的记录:
如果VAL.get('branch_id'):
字段\u to \u check=['drawer\u id','flexible\u id','runner\u id']
字段\u到\u检查\u dict={f:f在字段\u到\u检查中的记录[f]
字段\u到\u检查\u目录更新({f:f在vals中表示字段\u到\u检查中的f})
如果没有(字段\u到\u检查\u dict.values()):
raise USERROR()
这有点复杂。您也可以先调用
super
,然后再进行检查。引发异常将回滚所有更改,因此不会发生任何事情

res=super(MyModel,self).write(vals)
请自行记录:
如果VAL.get('branch_id'):
字段\u to \u check=['drawer\u id','flexible\u id','runner\u id']
记录中的字段检查=[字段检查中的f记录[f]
如果没有(字段到检查记录中的字段):
raise USERROR()
返回res

in fields\u to\u check\u in\u vals我总是收到:[真的,真的,真的,真的,真的,真的,真的,真的,真的,但那些字段是空的(未选中)。好吧,这很奇怪,做
vals.get(f)
然后代替
f in vals
。更新了我的问题,也许你可以分享一些智慧:)为write方法添加了一个解决方案。谢谢你如此深入的解释