Домени пошуку

Домени пошуку являють собою список кортежів, що містять умови, та операторів зв’язку


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), ],
       ]),
   ])))

Домени пошуку
Володимир Карабанов 4 травня, 2022
Поділитися цією публікацією
Теги
Архів
SQL only бекап засобами PostgreSQL
Робимо бекап без атачментів для баз будь-якого розміру