ドメインフィルター式を使用してOPenERPのレコードをフィルター処理したい
記録された場所にユーザーのリストのフィールドがあるので、ユーザーがリストにログインした場所のレコードを取得したい
[(user.id , 'in' , 'user_ids')]
これは機能しません
このエラーを返します:
File "/usr/lib/pymodules/python2.7/openerp/osv/orm.py", line 2356, in search
return self._search(cr, user, args, offset=offset, limit=limit, order=order, context=context, count=count)
File "/usr/lib/pymodules/python2.7/openerp/osv/orm.py", line 4846, in _search
self._apply_ir_rules(cr, user, query, 'read', context=context)
File "/usr/lib/pymodules/python2.7/openerp/osv/orm.py", line 4728, in _apply_ir_rules
rule_where_clause, rule_where_clause_params, rule_tables = rule_obj.domain_get(cr, uid, self._name, mode, context=context)
File "/usr/lib/pymodules/python2.7/openerp/addons/base/ir/ir_rule.py", line 156, in domain_get
query = self.pool.get(model_name)._where_calc(cr, SUPERUSER_ID, dom, active_test=False)
File "/usr/lib/pymodules/python2.7/openerp/osv/orm.py", line 4676, in _where_calc
e = expression.expression(cr, user, domain, self, context)
File "/usr/lib/pymodules/python2.7/openerp/osv/expression.py", line 632, in __init__
self.parse(cr, uid, context=context)
File "/usr/lib/pymodules/python2.7/openerp/osv/expression.py", line 759, in parse
field_path = left.split('.', 1)
AttributeError: 'int' object has no attribute 'split'
私を助けてください。
ドメイン構文が間違っています。
[('user_ids', '=' , user.id)]
である必要があります
検索ドメインの各タプルには、次の形式の3つの要素が必要です。('field_name', 'operator', value)
、ここで:
field_nameは、オブジェクトモデルのフィールドの有効な名前である必要があります。おそらく、ドット表記を使用した多対1の関係に従います。たとえば、「street」または「partner_id.country」は有効です。値。
operatorは、このリストの有効な比較演算子を含む文字列である必要があります。=, !=, >, >=, <, <=, like, ilike, in, not in, child_of, parent_left, parent_right
これらの演算子のほとんどのセマンティクスは明らかです。 child_of
演算子は、このモデルのセマンティクスに従って(つまり、self._parent_name
、デフォルトではparent_id
という名前の関係フィールドに従って)、特定のレコードの子または孫であるレコードを検索します。
valueは、タイプに応じて、field_nameの値と比較するための有効な値である必要があります。
ドメイン基準は、タプル間に追加できる3つの論理演算子を使用して組み合わせることができます: '&'(論理AND、デフォルト)、 '| '(論理OR)、'! '(論理NOT)。これらは、プレフィックス演算子と、 '&'および '|のアリティです。 ) '演算子は2ですが、'! 'のアリティは1です。初めて組み合わせるときは、この点に十分注意してください。
これは、言語が英語ではないベルギーとドイツから[〜#〜] abc [〜#〜]という名前のパートナーを検索する例です::
[('name','=','ABC'),'!',('language.code','=','en_US'),'|',('country_id.code','=','be'),('country_id.code','=','de')]
'&'はデフォルトであるため省略されています。もちろん、言語に '!='を使用することもできます。 、しかし、このドメインが実際に表すのは::
(name is 'ABC' AND (language is NOT english) AND (country is Belgium OR Germany))
単純なケースではこれは正しいですが、現在のオブジェクトをその関数フィールドでフィルタリングしたい場合、このフィールドの関数内のコードが実行されないことに非常に驚かれることでしょう。代わりに、このフィールドのfnct_search部分が実行され、さまざまなことができるようになります。
フィルタ式の左側は、現在のオブジェクト、および右側のコンテキストで評価されます。 —内部コンテキストのコンテキストで(現在のユーザーを読み取ります)。
左部分は後右で評価されるため、ユーザーモデルに機能フィールドを追加し、そこで計算を行って、それらを受け取ることができます。オブジェクト側の計算とそれらを考慮に入れます。
詳細については、この回答を参照してください: https://stackoverflow.com/a/21336100/674557