定位
Django 是「全家桶」框架:ORM、后台管理、认证、表单、缓存、国际化全都有,且质量稳定。二十年的积累,是 Python Web 里最成熟的选择。
最被低估的能力是 admin——定义好模型,后台管理界面自动生成,带搜索、筛选、权限。做内部系统能省掉一半工作量。
安装与创建
pip install django
django-admin startproject mysite
cd mysite
python manage.py startapp blog
python manage.py migrate # 建表
python manage.py createsuperuser # 建管理员
python manage.py runserver
访问 http://127.0.0.1:8000/admin/ 就能看到后台。
最小示例
1. 定义模型
# blog/models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
slug = models.SlugField(unique=True)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
is_pub = models.BooleanField(default=True)
class Meta:
ordering = ['-created_at']
def __str__(self):
return self.title
2. 注册到 admin
# blog/admin.py
from django.contrib import admin
from .models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'created_at', 'is_pub')
list_filter = ('is_pub', 'created_at')
search_fields = ('title', 'content')
prepopulated_fields = {'slug': ('title',)}
这十行代码就是一个可用的内容管理系统:列表、筛选、搜索、富文本编辑、权限控制全有了。
3. 视图
# blog/views.py
from django.shortcuts import render, get_object_or_404
from .models import Article
def article_list(request):
articles = Article.objects.filter(is_pub=True)
return render(request, 'blog/list.html', {'articles': articles})
def article_detail(request, slug):
article = get_object_or_404(Article, slug=slug)
return render(request, 'blog/detail.html', {'article': article})
4. 路由
# blog/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.article_list, name='list'),
path('<slug:slug>/', views.article_detail, name='detail'),
]
核心概念
1. ORM 与迁移
Django 的 ORM 直接绑定迁移系统:改模型 → makemigrations → migrate。
python manage.py makemigrations
python manage.py migrate
迁移文件要进版本控制。它是数据库结构的唯一真相。
2. MTV 而不是 MVC
Django 叫 Model-Template-View,实际对应 MVC 的 Model-View-Controller:
| Django | 传统 MVC |
|---|---|
| Model | Model |
| Template | View |
| View | Controller |
3. settings 是分环境的
一个 settings.py 撑不住多环境。常见做法:
settings/
├── base.py # 公共配置
├── dev.py # from .base import *
└── prod.py
用 DJANGO_SETTINGS_MODULE=mysite.settings.prod 切换。
常见坑
① manage.py runserver 不能上生产
它是开发服务器,单线程、无并发处理、没做安全检查。生产用 gunicorn / uvicorn:
gunicorn mysite.wsgi:application -w 4 -b 0.0.0.0:8000
② 忘记 ALLOWED_HOSTS
生产环境必须配置,否则所有请求被拒:
ALLOWED_HOSTS = ['example.com', 'www.example.com']
③ N+1 查询
# 差:每篇文章查一次作者
for a in Article.objects.all():
print(a.author.name)
1. 好:一次 join
for a in Article.objects.select_related('author').all():
print(a.author.name)
多对多用 prefetch_related。这是 Django 最常见的性能问题。
④ 静态文件在 DEBUG=False 下 404
runserver 会自动服务静态文件,生产不会。要 collectstatic + 交给 Nginx/WhiteNoise。
什么时候选它
- 内容型网站、博客、CMS
- 内部管理系统(admin 优势巨大)
- 需求相对标准、要快速上线
- 团队需要长期维护(Django 的稳定性是资产)
不选它的场景:纯 API 服务(FastAPI 更轻更快)、需要极致异步性能、团队已经深度使用异步生态。
和 FastAPI 的取舍
| Django | FastAPI | |
|---|---|---|
| 后台管理 | 自带 | 无 |
| ORM | 自带且强绑定 | 自选 |
| API 文档 | 需 DRF + drf-spectacular | 自动生成 |
| 异步 | 后补的 | 原生 |
| 适合 | 网站 + 后台 | 纯 API |
判断标准:需要给人用的后台界面吗?需要 → Django。只是给程序调用的 API → FastAPI。