🐛 Типичные ошибки — Урок 38
⚡ Топ-5 ошибок урока 38
- CursorPagination без кастомного класса → AttributeError на
ordering - FileHandler без созданной директории → FileNotFoundError
disable_existing_loggers: True→ Django-логгеры отключены- SQL-логи не появляются → забыли
DEBUG = True - Относительный путь в
filename→ файл создаётся в неизвестном месте
Типичные ошибки при работе с пагинацией и логированием
Ошибка 1: CursorPagination без поля ordering в модели
Симптом: AssertionError: Invalid ordering field 'created' on serializer или FieldError: Cannot resolve keyword 'created' into field
Неверно:
# settings.py — используем базовый CursorPagination напрямую
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.CursorPagination',
'PAGE_SIZE': 5,
}
# В модели Book нет поля 'created' — падает при первом запросе!
Верно:
# pagination.py
from rest_framework.pagination import CursorPagination
class BookCursorPagination(CursorPagination):
page_size = 5
ordering = 'published_date' # поле, которое РЕАЛЬНО существует в модели
# settings.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'first_app.pagination.BookCursorPagination',
'PAGE_SIZE': 5,
}
Ошибка 2: FileHandler — директория не создана
Симптом: FileNotFoundError: [Errno 2] No such file or directory: '/path/to/logs/db.log' — сервер не запускается.
Неверно:
# settings.py — директория logs/ не создана
'file': {
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'logs', 'db_logs.log'), # logs/ не существует!
}
Верно:
# settings.py — создать директорию до настройки LOGGING
import os
LOGS_DIR = os.path.join(BASE_DIR, 'logs')
os.makedirs(LOGS_DIR, exist_ok=True) # создаст, если не существует
LOGGING = {
...
'handlers': {
'file': {
'class': 'logging.FileHandler',
'filename': os.path.join(LOGS_DIR, 'db_logs.log'),
},
},
...
}
Ошибка 3: disable_existing_loggers: True
Симптом: после добавления LOGGING пропадают все системные логи Django — ошибки 500, предупреждения безопасности, статусы HTTP-запросов.
Неверно:
LOGGING = {
'version': 1,
'disable_existing_loggers': True, # отключает ВСЕ встроенные логгеры!
...
}
Верно:
LOGGING = {
'version': 1,
'disable_existing_loggers': False, # встроенные логгеры продолжают работать
...
}
Ошибка 4: SQL-логи не появляются (DEBUG = False)
Симптом: LOGGING настроен, но django.db.backends ничего не пишет ни в консоль, ни в файл.
Причина:
В Django логгер django.db.backends с уровнем DEBUG передаёт SQL только при DEBUG = True. При DEBUG = False Django оптимизирует работу и не собирает тексты запросов.
Проверьте:
# settings.py
DEBUG = True # обязательно для SQL-логов в django.db.backends
LOGGING = {
...
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'level': 'DEBUG', # нужно совпадение с handler.level или ниже
},
},
}
Ошибка 5: Относительный путь в FileHandler
Симптом: файл лога создаётся в непредсказуемом месте — зависит от того, откуда запускается сервер.
Неверно:
'file': {
'class': 'logging.FileHandler',
'filename': 'db.log', # относительный путь — плохая практика!
}
Верно:
'file': {
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'db.log'), # абсолютный путь относительно корня проекта
}
Ошибка 6: pagination_class без page_size
Симптом: API возвращает весь queryset без пагинации, хотя класс задан.
Неверно:
class BookPagination(PageNumberPagination):
pass # page_size не задан — пагинация не работает!
class BookListView(ListAPIView):
pagination_class = BookPagination
Верно:
class BookPagination(PageNumberPagination):
page_size = 10 # обязательно задать размер страницы!
class BookListView(ListAPIView):
pagination_class = BookPagination
Или задать PAGE_SIZE глобально в REST_FRAMEWORK.
Ошибка 7: Неверный путь к кастомному классу пагинации
Симптом: ImportError: Module "myapp.pagination" does not define a "SomePagination" attribute/class
Неверно:
# settings.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'pagination.CustomCursorPagination', # нет имени приложения!
}
Верно:
# settings.py — полный dotted path: app_name.module.ClassName
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'first_app.pagination.CustomCursorPagination',
}
Путь должен быть полным: имя_приложения.имя_модуля.ИмяКласса.