Django
High-level Python web framework. Two active release lines: 6.0.3 (latest, Dec 2025, requires Python >=3.12) and 5.2.x LTS (Apr 2025, Python >=3.10, EOL Apr 2028). Feature releases roughly every 8 months. Deprecations follow a two-release cycle before removal.
Warnings
- breaking Django 6.0 requires Python >=3.12. Python 3.10 and 3.11 support dropped. Projects on Python 3.10/3.11 must stay on Django 5.2 LTS (EOL Apr 2028).
- breaking cx_Oracle driver removed in Django 6.0. Oracle users must migrate to the oracledb driver (>=1.3.2). cx_Oracle was deprecated in Django 5.0.
- breaking QuerySet.return_insert_columns renamed to returning_columns in Django 6.0.
- breaking Django 6.0 overhauled email internals to use Python's modern email API. SafeMIMEText, SafeMIMEMultipart, and BadHeaderError are deprecated. Custom email subclasses relying on internal underscore methods may break silently.
- breaking MariaDB minimum version raised to 10.6 in Django 6.0. MariaDB 10.5 support dropped.
- gotcha DEFAULT_AUTO_FIELD must be set in settings.py. Omitting it causes W042 system check warnings for every model in the project. LLMs frequently omit this from generated settings files.
- gotcha Two active release lines with different Python requirements. Django 6.0 (Python >=3.12) and Django 5.2 LTS (Python >=3.10). LLM-generated code often installs the latest without checking Python version compatibility.
- gotcha ADMINS and MANAGERS setting format changed in Django 6.0: list of (name, email) tuples is deprecated. Must be a list of email strings. Format as '"Name" <email>' for named addresses.
Install
-
pip install Django -
pip install "Django>=5.2,<6" -
pip install "Django[argon2]"
Imports
- django.setup
import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') django.setup() - DEFAULT_AUTO_FIELD
# In settings.py DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
Quickstart
# settings.py (minimal)
INSTALLED_APPS = [
'django.contrib.contenttypes',
'django.contrib.auth',
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
# models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-created_at']
# shell
# python manage.py makemigrations
# python manage.py migrate
# python manage.py runserver