12

ドメインフィルター式を使用して、OPenERP でレコードをフィルター処理したい

recoredにはユーザーのリストのフィールドがあるので、ユーザーがリストにログインしたレコードを取得したい

[(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'

私を助けてください。

4

2 に答える 2

32

ドメインの構文が間違っています。

そのはず[('user_ids', '=' , user.id)]

  1. 検索ドメインの各タプルには、次の形式の 3 つの要素が必要('field_name', 'operator', value)です。

  2. field_nameは、オブジェクト モデルのフィールドの有効な名前である必要があります。ドット表記を使用した多対 1 の関係に従う可能性があります。たとえば、'street' または 'partner_id.country' が有効な値です。

  3. operatorは、次のリストの有効な比較演算子を含む文字列である必要があります: =, !=, >, >=, <, <=, like, ilike, in, not in, child_of, parent_left, parent_right これらの演算子のほとんどのセマンティクスは明らかです。オペレーターは、このchild_ofモデルのセマンティクスに従って (つまり self._parent_name、デフォルトでparent_id.

  4. valueは、その型に応じて、field_nameの値と比較する有効な値である必要があります。

ドメイン条件は、タプル間に追加できる 3 つの論理演算子を使用して組み合わせることができます: ' & ' (論理 AND、デフォルト)、' | ' (論理和), ' ! ' (論理否定)。これらは前置演算子と「&」および「| 」のアリティです。' 演算子は 2 ですが、' ! ' はちょうど 1 です。最初にそれらを組み合わせるときは、この点に十分注意してください。

以下は、言語が英語でないベルギーとドイツのABCという名前のパートナーを検索する例です::

[('name','=','ABC'),'!',('language.code','=','en_US'),'|',('country_id.code','=','be'),('country_id.code','=','de')]

The '&' is omitted as it is the default, and of course we could have used '!=' for the language, but what this domain really represents is::

(name is 'ABC' AND (language is NOT english) AND (country is Belgium OR Germany))
于 2013-01-31T04:39:01.827 に答える
0

単純なケースではこれは正しいですが、現在のオブジェクトをその機能フィールドでフィルタリングしたい場合、このフィールドの機能のコードが実行されないことに非常に驚かれることでしょう。代わりに、このフィールドの fnct_search 部分が実行され、さまざまなことが可能になります。

フィルター式の左側の部分は現在のオブジェクトのコンテキストで評価され、右側の部分内部コンテキストのコンテキストで評価されます(現在のユーザーを読み取ります)。

左側の部分は右側の後に評価されるため、機能フィールドをユーザー モデルに追加し、そこでいくつかの計算を行い、オブジェクト側でそれらの計算を受け取り、それらを考慮に入れることができます。

詳細については、この回答を参照してください: https://stackoverflow.com/a/21336100/674557

于 2015-03-21T02:46:43.817 に答える