Как фильтровать данные в OpenERP с помощью списка доменов

Я хочу фильтровать recods в 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'

Пожалуйста, помогите мне.

Ответ 1

Синтаксис вашего домена неверен.

Это должно быть [('user_ids', '=' , user.id)]

  • Каждый кортеж в домене поиска должен иметь 3 элемента в форме: ('field_name', 'operator', value), где:

  • имя_поля должно быть допустимым именем поля объектной модели, возможно, после отношений "много-к-одному" с использованием точечной нотации, например "улица" или "partner_id.country" допустимые значения.

    Оператор
  • должен быть строкой с действительным оператором сравнения из этого списка: =, !=, >, >=, <, <=, like, ilike, in, not in, child_of, parent_left, parent_right        Семантика большинства этих операторов очевидна.         Оператор child_of будет искать записи, которые являются детьми или внуками определенной записи,         в соответствии с семантикой этой модели (т.е. после поля отношения, названного         self._parent_name, по умолчанию parent_id.

  • Значение должно быть допустимым значением для сравнения со значениями field_name, в зависимости от его типа.

Критерии домена могут быть объединены с использованием 3 логических операторов, которые могут быть добавлены между кортежами: " &" (логический И, по умолчанию), " |" (логический ИЛИ), '!' (логическое NOT).       Это операторы префикс, и арность оператора & и | 'равна 2, а arity > ! '- это просто 1. Будьте очень осторожны, когда вы их объединяете в первый раз.

Вот пример поиска партнеров ABC из Бельгии и Германии, язык которых не является английским:

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

'&' опущен, поскольку он по умолчанию, и, конечно, мы могли бы использовать '! =' для языка, но что этот домен действительно представляет is::

(name is 'ABC' AND (language is NOT english) AND (country is Belgium OR Germany))

Ответ 2

В простом случае это правильно, но если вы хотите фильтровать текущий объект по его функциональному полю, вы будете очень удивлены тем, что код в этом поле не будет выполняться; вместо этого будет выполняться часть fnct_search этого поля, что позволит вам делать разные вещи.

Левая часть выражения фильтра оценивается в контексте текущего объекта и правая часть - в контексте внутреннего контекста (текущий пользователь).

Левая часть оценивается после справа, поэтому вы можете добавить функциональное поле в пользовательскую модель, провести там некоторые вычисления и затем получить эти вычисления на стороне объекта и принимать их во внимание.

Подробнее см. в этом ответе: fooobar.com/info/442825/...