Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Основные различия между Django 2 и Django 3
Django 3 вышел в декабре 2019 года с существенными изменениями, направленными на модернизацию фреймворка и отказ от устаревшего кода.
1. Поддержка Python версий
Django 2:
- Поддерживает Python 3.5, 3.6, 3.7, 3.8
- Поддержка Python 2.7 была прекращена в Django 2.0
Django 3:
- Требует минимум Python 3.6
- Поддерживает Python 3.6, 3.7, 3.8, 3.9
- Начинает подготовку к отказу от поддержки Python 3.5
# Django 3 требует строгую типизацию Python 3.6+
# Возможно использование type hints
from typing import Optional
from django.http import HttpResponse
def my_view(request) -> HttpResponse:
return HttpResponse("Hello World")
2. Асинхронная поддержка (Async Views)
Django 2:
- Полностью синхронный фреймворк
- Нет встроенной поддержки async/await
Django 3:
- Экспериментальная поддержка асинхронных views
- Позволяет писать асинхронные обработчики:
# Django 3 - асинхронный view
async def my_async_view(request):
# Можно использовать await для асинхронных операций
result = await some_async_function()
return HttpResponse(f"Result: {result}")
# Все еще поддерживаются синхронные views
def my_sync_view(request):
return HttpResponse("Sync")
3. ASGI поддержка
Django 2:
- Работает только с WSGI (Web Server Gateway Interface)
- Требует Gunicorn, uWSGI и т.п.
Django 3:
- Добавлена встроенная ASGI поддержка
- Позволяет развертывать приложения на асинхронных серверах (Daphne, Hypercorn)
- Автоматическая генерация
asgi.pyпри создании проекта:
# Django 3: django_project/asgi.py
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings')
application = get_asgi_application()
4. Марлёт-новый ORM для связей (многие-ко-многим)
Django 2:
- Трудный способ работы с промежуточными таблицами
Django 3:
- Улучшена работа с отношениями Many-to-Many
- Более удобный синтаксис для сложных запросов
5. QuerySet.explain() для анализа запросов
Django 2:
- Нет встроенного инструмента для анализа производительности
Django 3:
- Добавлен метод
explain()для анализа SQL запросов:
from django.db.models import QuerySet
# Django 3
queryset = MyModel.objects.all()
print(queryset.explain()) # Выводит план выполнения запроса
# Результат:
# Seq Scan on myapp_mymodel (cost=0.00...
6. Изменения в URL routing
Django 2:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
]
Django 3:
- Рекомендуется использовать
re_path()вместо устаревшегоurl() - Новый синтаксис
path()с использованием converters:
from django.urls import path, re_path
from . import views
urlpatterns = [
# Новый способ - более читаемо
path('articles/<int:year>/', views.year_archive),
# Старый способ (всё еще работает)
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
]
7. Улучшение формы класса ModelAdmin
Django 3:
- Более гибкая конфигурация администраторского интерфейса
- Лучшая поддержка кастомизации
8. Удаление устаревшего кода
Django 3 удалил:
django.utils.timezone.utc(используйdatetime.timezone.utc)- Поддержку Oracle Database 11g и 12c (требуется 12.2+)
- Устаревшие API для работы с формами и валидацией
django.conf.urls.patterns(используй список напрямую)
# Django 2 - устаревшее
from django.conf.urls import patterns, url
urlpatterns = patterns('',
url(r'^articles/', include('articles.urls')),
)
# Django 3 - правильно
from django.urls import path, include
urlpatterns = [
path('articles/', include('articles.urls')),
]
9. Middleware и сигналы
Django 3:
- Более строгие требования к использованию middleware
- Лучшая обработка исключений
Таблица отличий
| Функция | Django 2 | Django 3 |
|---|---|---|
| Python | 3.5-3.8 | 3.6+ |
| Async Views | Нет | Да (экспериментально) |
| ASGI | Нет | Да |
| QuerySet.explain() | Нет | Да |
| Преобразование URL | url() | path(), re_path() |
| Поддержка Oracle | 11g, 12c | 12.2+ |
Миграция с Django 2 на Django 3
# Этапы обновления:
# 1. Обновить Python до 3.6+
# 2. Заменить url() на path() или re_path()
# 3. Обновить импорты (например, timezone.utc)
# 4. Проверить совместимость всех зависимостей
# 5. Запустить тесты
pip install --upgrade django==3.0
python manage.py test # Убедиться, что всё работает
Основной вывод: Django 3 — это переход на современный Python (3.6+), добавление асинхронной поддержки и удаление устаревшего кода для облегчения разработки в будущем.