← Назад к вопросам

В чем разница между Django 2 и Django 3?

2.0 Middle🔥 151 комментариев
#Django

Комментарии (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 2Django 3
Python3.5-3.83.6+
Async ViewsНетДа (экспериментально)
ASGIНетДа
QuerySet.explain()НетДа
Преобразование URLurl()path(), re_path()
Поддержка Oracle11g, 12c12.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+), добавление асинхронной поддержки и удаление устаревшего кода для облегчения разработки в будущем.

В чем разница между Django 2 и Django 3? | PrepBro