From b44ea1677f674459d7c03c329962625167c0f149 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Tue, 11 Nov 2025 00:36:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=83=D0=BC=D0=BD=D0=B0=D1=8F=20=D1=84=D0=B8?= =?UTF-8?q?=D0=BB=D1=8C=D1=82=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B5=20=D0=BF=D0=BE=20?= =?UTF-8?q?email?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Теперь поиск по email работает с ограничениями: - Если запрос содержит @, требуется минимум 2 символа после @ - Если в запросе нет @, требуется минимум 3 символа всего Это предотвращает нежелательные результаты, такие как: - Поиск по одному символу @ находит всех клиентов (все содержат @) - Поиск по 1-2 буквам находит очень широкий результат Примеры работы: - team_x3m@ → не будет искать по email (только 0 символов после @) - @bk → будет искать по email (2 символа после @) - natul → будет искать по email (4 символа, нет @, достаточно) - na → не будет искать по email (только 2 символа, нет @) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- myproject/customers/views.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/myproject/customers/views.py b/myproject/customers/views.py index 7380ece..0efb265 100644 --- a/myproject/customers/views.py +++ b/myproject/customers/views.py @@ -153,8 +153,22 @@ def api_search_customers(request): # Ищем по имени, email или телефону # Используем Q-объекты для OR условий - # Для email используем icontains (поиск по части) - это позволит найти по любой части email - q_objects = Q(name__icontains=query) | Q(email__icontains=query) + + # Определяем, нужно ли искать по email + # Критерии: (@present AND 2+ chars after @) OR (no @ AND 3+ chars total) + search_by_email = False + if '@' in query: + # Если есть @, то нужно 2+ символа после @ + parts = query.split('@') + if len(parts) >= 2 and len(parts[-1]) >= 2: + search_by_email = True + elif len(query) >= 3: + # Если нет @, требуем минимум 3 символа для поиска по email + search_by_email = True + + q_objects = Q(name__icontains=query) + if search_by_email: + q_objects |= Q(email__icontains=query) # Для телефона ищем по нормализованному номеру и по цифрам if phone_normalized: