Домени пошуку являють собою список кортежів, що містять умови, та операторів зв’язку
request.env[place'].sudo().search([
('is_shown_on_mobile', '=', True),
('is_checkpoint', '=', False),
('primary_category_id', '!=', False),
('latitude', '!=', False), ('longitude', '!=', False),
'|', ('active', '=', True), ('active', '=', False)]))
Важливо! Доменом є саме список цих елементів. Окремий кортеж не є доменом.
[('name','=','ABC'), ('language.code','!=','en_US'),
'|',('country_id.code','=','be'), ('country_id.code','=','de')]
Домен
[('name','=','ABC')]
і навіть пустий список є коректним доменом
[]
Не домен (лише кортеж з умовами)
('name','=','ABC')
Окремий кортеж умови складається з трьох елементів
Назва поля, причому для полів типу Many2one можна використовувати поля зі зв’язаної моделі partner_id.country_id.code
[('partner_id.country_id.code','=','ABC')]
Другим елементом є оператор, третім значення сумісне з оператором та полем. Наприклад, число, дата, список або рядок.
Важливо! Якщо ми створюємо умову для поля Many2one треба передавати числове значення id, а не поле.
Неправильно
[('partner_id','=',self.partner_id)]
Правильно
[('partner_id','=',self.partner_id.id)]
Оператори умов доменів
= рівність (записи де, значення поля дорівнює переданому значенню)
!= не рівність (записи де, значення поля не дорівнює переданому значенню)
>, >=, <, <= - більше, більше або дорівнює, менше, менше або дорівнює
=? - у вибірку також потраплять записи, де значення поля не встановлено
=like - оператор фільтрації за шаблоном. Використовує патерни _ та % будь-який символ та будь яка кількість будь яких символів. Щоб вказати один або більше символів, використовують комбінацію _%. Також патернів може бути декілька.
copied_count = self.search_count(
[('name', '=like', (u"Copy of {}%").format(self.name))])
like - огортає передане значення в патерни %, аналогічний
[('name','=like','%value%')]
=ilike та ilike - регістр незалежні версії like операторів
not like та not ilike - зворотні до відповідних like операторів
in - перевіряє чи значення поля є серед значень списку значень. Для цього параметру значенням має бути саме список
not in - зворотний до in
child_of - перевіряє чи є запис є нащадком запису або одного запису зі списку. Працює для моделей, що є ієрархічними
domain_company = [
'|', ('company_id', '=', False),
('company_id', 'child_of', values['company_id'].ids)]
parent_of - перевіряє чи є запис є батьківським для запису або одного запису зі списку. Працює для моделей, що є ієрархічними
domain = AND([domain, [('subcontractor_ids', 'parent_of', subcontractor.ids)]])
Комбінування умов доменів
Є три оператора для роботи над умовами доменами
'&' - оператор І (AND). Він використовується, якщо оператор не вказаний
'|' - оператор АБО (OR).
'!' - оператор НІ (NOT). На відміну від перших двох це унарний оператор
default_domain = ['&', ('config_id', '=', config_id), '!',
'|', ('state', '=', 'draft'), ('state', '=', 'canceled')]
Спочатку може бути складно звикнути способу запису.
Важливо! Оператор виконується над наступними двома елементами, незалежно є цей елемент умовою чи оператором
Розглянемо приклад
['|', A, '&','|', B, C, D] розбір домену відбувається з ліва на право
1. Операція АБО надо А та результатом І '&'
2. Операція І виконається над АБО та … (ще не визначено)
3. Друга операція АБО виконається над В та С
4. Межі другої операції або визначено, а отже І виконається над результатом АБО В та С та D
5. Виконається перша АБО
А отже виконуються вони в такій послідовності
Важливо! ['|', A, B, '|',C] є помилковим, оскільки до С не має пари
Функції AND та OR
Функції які спрощують заплутаний синтаксис доменної нотації, як параметри вони приймають список доменів
Важливо! приймають список доменів, а кортежів умов. Тобто якщо кожен кортеж треба обробити окремо, його треба огорнути в список
request.env['place'].sudo().search(
AND([
[('is_shown_on_mobile', '=', True),
('is_checkpoint', '=', False),
('primary_category_id', '!=', False),
('latitude', '!=', False), ('longitude', '!=', False), ],
OR([
[('write_date', '>=', start_date), ],
[('id', 'in', ids), ],
]),
OR([
[('active', '=', True), ],
[('active', '=', False), ],
]),
])))