Улучшения: - Исправлена отображение цены в таблице вариантов: заменено sale_price на actual_price чтобы правильно обрабатывать случаи когда скидка не установлена - Оптимизирован property in_stock: вычисляется в памяти из prefetched данных вместо отдельного запроса EXISTS к БД - Оптимизирован property price: использует actual_price (sale_price или price) вместо только sale_price, добавлена документация о требовании prefetch_related - Оптимизирован DetailView.get_context_data: используется кешированный prefetch_related вместо создания нового queryset для items - Исправлена AJAX функция _get_items_data: использует actual_price вместо sale_price Результат: - Исчезла проблема с выводом "None" вместо цены - Сокращено количество запросов к БД с 4-5 до 3 для страницы detail - Улучшена производительность при работе с группами вариантов 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
Структура модуля views
Файл products/views.py был разбит на несколько специализированных модулей для улучшения читаемости и поддерживаемости кода.
Статистика оптимизации
До рефакторинга:
- Файлов: 1 (
views.py) - Строк кода: 1202
- Дублированный код: ~400 строк (12 функций управления фото + 3 функции обработки фото)
После рефакторинга:
- Файлов: 7 модулей
- Строк кода: 1284 (включая документацию)
- Дублированный код: УСТРАНЁН
- Экономия: ~400 строк дублированного кода заменены на универсальные функции
Структура модулей
1. __init__.py (112 строк)
Экспортирует все представления для обратной совместимости с urls.py.
Позволяет использовать импорты вида: from products.views import ProductListView
2. utils.py (73 строки)
Утилиты для работы с фотографиями:
validate_photo()- валидация загружаемого фотоhandle_photos()- УНИВЕРСАЛЬНАЯ функция обработки фото (заменяет 3 дублирующиеся функции)
3. photo_management.py (310 строк)
Универсальные функции управления фотографиями:
- 4 базовые функции:
generic_photo_delete(),generic_photo_set_main(),generic_photo_move_up(),generic_photo_move_down() - 12 оберток для Product, ProductKit и Category (заменяют 12 дублирующихся функций из оригинала)
Устранённое дублирование:
- Было: 12 отдельных функций (по 4 для каждой модели)
- Стало: 4 универсальные функции + 12 простых оберток
4. product_views.py (182 строки)
CRUD представления для товаров (Product):
ProductListView- список товаров с фильтрацией и поискомProductCreateView- создание товараProductDetailView- просмотр товараProductUpdateView- редактирование товараProductDeleteView- удаление товара
5. productkit_views.py (249 строк)
CRUD представления для комплектов (ProductKit):
ProductKitListView- список комплектовProductKitCreateView- создание комплекта с компонентамиProductKitDetailView- просмотр комплектаProductKitUpdateView- редактирование комплектаProductKitDeleteView- удаление комплекта
6. category_views.py (280 строк)
CRUD представления для категорий (ProductCategory):
TreeItem- класс для элемента дерева категорийProductCategoryListView- иерархическое дерево категорий с товарами и комплектамиProductCategoryCreateView- создание категорииProductCategoryDetailView- просмотр категорииProductCategoryUpdateView- редактирование категорииProductCategoryDeleteView- удаление категории
7. api_views.py (78 строк)
API представления:
search_products_and_variants()- поиск товаров и групп вариантов для автокомплита
Преимущества новой структуры
✅ Устранено дублирование
- 12 функций управления фото → 4 универсальные + 12 простых оберток
- 3 функции обработки фото → 1 универсальная функция
✅ Улучшена организация
- Логическое разделение по функциональным областям
- Каждый модуль отвечает за свою сущность (Product, ProductKit, Category)
- Легко найти нужный код
✅ Упрощена поддержка
- Изменения в одном типе представлений не затрагивают другие
- Проще тестировать отдельные компоненты
- Легче добавлять новый функционал
✅ Обратная совместимость
- Все импорты в
urls.pyработают без изменений - Благодаря
__init__.pyвнешний API не изменился
✅ Следование принципам
- SRP (Single Responsibility Principle) - каждый модуль отвечает за одну область
- DRY (Don't Repeat Yourself) - устранено дублирование кода
- Separation of Concerns - разделение по ответственности
Примеры использования
Импорт представлений (работает как раньше):
from products.views import ProductListView, ProductCreateView
from products.views import productkit_photo_delete
from products.views import search_products_and_variants
Импорт из конкретного модуля (новая возможность):
from products.views.product_views import ProductListView
from products.views.photo_management import generic_photo_delete
from products.views.utils import validate_photo
Изменения в коде
Удалено:
- Неиспользуемый импорт
import json - Комментарий-мусор "Временный файл для добавления в views.py"
Добавлено:
- Docstrings для всех модулей
- Комментарии к универсальным функциям
- Документация параметров функций
Тестирование
После рефакторинга рекомендуется:
- Запустить Django сервер:
python manage.py runserver - Проверить все CRUD операции для Product, ProductKit и Category
- Проверить управление фотографиями (upload, delete, set main, move up/down)
- Проверить API endpoint для поиска товаров
Потенциальные улучшения
В будущем можно:
- Добавить базовый класс
BasePhotoViewдля дальнейшего упрощения - Вынести общую логику ListView в миксины
- Добавить unit-тесты для каждого модуля
- Создать отдельный модуль для миксинов и базовых классов