Якщо ви коли-небудь писали складні domain-фільтри в Odoo, які враховують як активні, так і неактивні записи, ви напевно стикалися з громіздкою конструкцією типу '|', ('active', '=', True), ('active', '=', False). Ця тріада операторів повторюється в коді знову і знову, роблячи його менш читабельним. Але є більш елегантне рішення — контекстний параметр 'active_test'.
Як це працює?
За замовчуванням Odoo автоматично фільтрує неактивні записи в усіх пошукових запитах. Це поведінка "з коробки", яка контролюється через контекст. Коли ви використовуєте with_context(active_test=False), ви просто вимикаєте цей автоматичний фільтр:
Cпосіб з використанням домен - громіздко і незручно
partners = self.env['res.partner'].search([
'|',
('active', '=', True),
('active', '=', False),
('customer_rank', '>', 0)
])
Спосіб з використанням контексту - чисто і зрозуміло
partners = self.env['res.partner'].with_context(active_test=False).search([
('customer_rank', '>', 0)
])
Переваги підходу
Перша і найочевидніша перевага — читабельність коду. Замість трьох рядків domain-логіки ви додаєте один метод до ланцюжка викликів. Друга перевага — це продуктивність: Odoo не потрібно обробляти складний OR-оператор, система просто не додає WHERE-умову для поля active. Третя перевага — менше місця для помилок. Складні domain-фільтри з операторами '|' легко зламати, особливо коли їх декілька в одному виразі.
Коли використовувати?
Цей підхід ідеальний для звітів, де потрібно бачити всю історію (включно з архівованими записами), для адміністративних інтерфейсів, де потрібен повний контроль над даними, або для міграційних скриптів. Наприклад, при генерації звіту по всіх продажах за рік:
def generate_annual_report(self):
# Отримуємо ВСІ продажі, навіть архівовані
sales = self.env['sale.order'].with_context(active_test=False).search([
('date_order', '>=', '2024-01-01'),
('date_order', '<=', '2024-12-31'),
])
return sales.generate_report()
Пам'ятайте: active_test=False — це не просто синтаксичний цукор, це правильний спосіб керувати видимістю записів в Odoo. Використовуйте його замість складних domain-фільтрів, і ваш код стане чистішим та зрозумілішим для всієї команди.