Домен в методе read_group - PullRequest
0 голосов
/ 07 мая 2019

Есть стандартный метод

 def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None, orderby=False)

Я звоню по этому супер и передаю домен вроде этого

[('end_date', '>=', '2019-05-01'), ('end_date', '<=', '2019-05-30'), ('employee', 'in', [49]), ('state', 'in', ['done'])]

и это работает.

но когда я пытаюсь добавить

domain.append(('&'))
domain.append(('state', 'in', ['progress']))

Я получаю

File "/home/www/workspace/openerp-7.0-20140804-231303/openerp/osv/expression.py", line 201, in normalize_domain
    assert expected == 0, 'This domain is syntactically not correct: %s' % (domain)
AssertionError: This domain is syntactically not correct: [('end_date', '>=', '2019-05-01'), ('end_date', '<=', '2019-05-30'), ('employee', 'in', [49]), ('state', 'in', ['done']), '&', ('state', 'in', ['progress'])]

в основном, необходимо отфильтровать все записи по датам и в состоянии 'done', а также все записи в состоянии' progress '.

UPDATE.

если я пользовательский домен

domain = [('end_date', '>=', '2019-05-01'), ('end_date', '<=', '2019-05-30'), ('employee', 'in', [49]),
         ('state', 'in', ['done'])]

я получаю 3 записи,

и если я использую

domain = [('employee', 'in', [49]), ('state', 'in', ['progress'])]

Я получаю результат с 2 записями,

но если я объединю эти домены, я получу 0 записей

domain = [('state', 'in', ['progress']),('end_date', '>=', '2019-05-01'), ('end_date', '<=', '2019-05-30'), ('employee', 'in', [49]),
         ('state', 'in', ['done'])]

как должен выглядеть мой домен, чтобы я получил 5 записей?

, вероятно, проблема в том, что записи, которые в 'progress' не имеют end_date

1 Ответ

1 голос
/ 07 мая 2019

Логические операторы '&' и '|' иметь arity 2, это означает, что за ними должно следовать 2 тройки («нормальные» доменные кортежи с 3 записями). Вы добавляете только одну тройку. В вашем случае вы можете просто удалить append из '&', потому что без использования логического оператора все / каждая тройка будут объединены с AND по умолчанию.

Логический оператор '!' имеет арность 1, кстати.

Вы можете найти достаточно информации об этом в официальной документации .

Домен представляет собой список критериев, каждый из которых является тройным (либо список или кортеж) из (field_name, operator, value), где:

field_name (str) имя поля текущей модели или отношение прохождение через Many2one с использованием точечной нотации, например «улица» или Оператор 'partner_id.country' (str) оператор, используемый для сравнения имя_поля со значением Допустимые операторы:

= равно! = Не равно

> больше чем

> = больше или равно

<меньше </p>

<= меньше или равно </p>

=? unset или равно (возвращает true, если значение равно None или False, в противном случае ведет себя как =)

= like совпадает field_name с шаблоном значения. Символ подчеркивания в шаблоне обозначает (соответствует) любой отдельный символ; знак процента% соответствует любой строке, состоящей из нуля или более символов.

like совпадает field_name с шаблоном% value%. Аналогично = like, но переносит значение на «%» перед соответствием

not like не совпадает с шаблоном% value%

или регистр нечувствителен, как

не похоже на регистр, не похожий на

= без учета регистра = как

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

не является неравным для всех предметов из значения

child_of - это дочерний элемент (потомок) записи значения. Принимает во внимание семантику модели (т.е. после поля отношения, названного _parent_name).

Критерии домена могут быть объединены с использованием логических операторов в префиксной форме:

'&' логическое И, операция по умолчанию для объединения критериев по одному другой. Arity 2 (использует следующие 2 критерия или комбинации).

'|' логическое ИЛИ, арность 2.

'!' логическое НЕ, арность 1.

Изменить: Даже если это будет другой вопрос, я постараюсь решить вашу специальную проблему домена:

[('employee_id', 'in', [49]),
'|',
    ('state', 'in', ['progress']),
    '&', ('state', 'in', ['done']),
        '&', ('end_date', '>=', '2019-05-01'), ('end_date', '<=', '2019-05-30')]

Это должно закончиться как (псевдо):

EMPLOYEE with ID 49 AND
(STATE is progress OR (STATE is done AND END_DATE is between ...))
...