核心用法
本技能系统梳理 Django 开发中的常见陷阱与最佳实践,分为八大模块:
1. QuerySet 延迟执行与性能
- QuerySet 是惰性求值的,直到迭代、切片或布尔判断时才查询数据库
- 避免重复查询:如需多次使用结果,先用
list(queryset)转换 exists()比bool(queryset)更高效,不获取完整数据行count()使用 SQL COUNT,而len()会拉取全部数据
2. N+1 查询问题解决
select_related:用于 ForeignKey/OneToOne,单次 JOIN 查询prefetch_related:用于 ManyToMany/反向外键,独立查询后缓存- 循环中访问关联对象必须预取,否则产生 N+1,建议使用 django-debug-toolbar 检测
Prefetch对象支持自定义查询集,可过滤或注解预取数据
3. ORM 常见陷阱
update()不触发save(),因此不发送信号、不更新 auto_now- 使用
F()表达式进行数据库级操作,如F('count') + 1,避免竞态条件 exclude(field=None)会排除 NULL 值,语义可能与预期不符values()后需用distinct()去重,否则可能产生重复行
4. 迁移管理
- 模型变更后需手动执行
makemigrations,非自动 - 迁移冲突时重命名避免碰撞,或使用
--merge合并,--fake标记已执行 squashmigrations可压缩迁移,但部署完成前保留原迁移
5. 生产环境配置
DEBUG=False时必须设置ALLOWED_HOSTS,否则崩溃SECRET_KEY必须保密,使用环境变量,禁止写入代码库- 生产环境需运行
collectstatic,DEBUG 模式与生产模式静态文件处理不同 - 区分
STATIC_ROOT(收集目标)与STATICFILES_DIRS(源目录)
6. CSRF 安全
- 表单需包含
{% csrf_token %},POST 请求否则会 403 - AJAX 请求需设置
X-CSRFToken头,从 cookie 获取令牌 @csrf_exempt存在安全风险,仅用于带独立认证的 Webhook
7. 测试策略
TestCase使用事务回滚,更快但无法测试事务行为TransactionTestCase真实提交,更慢但适用于事务测试Client测试完整请求流程,RequestFactory直接测试视图/中间件override_settings装饰器可临时修改配置进行测试
8. 常见编码错误
get()可能抛出DoesNotExist或MultipleObjectsReturned,安全写法用filter().first()auto_now无法手动覆盖,如需手动设置改用default=timezone.now- 循环导入问题:使用字符串引用如
ForeignKey('app.Model') related_name冲突时设为唯一值,或用related_name='+'禁用
显著优点
- 覆盖 Django 开发全生命周期,从查询优化到部署配置
- 提供具体代码示例和替代方案,即查即用
- 强调性能陷阱(N+1、重复查询)和安全风险(CSRF、密钥泄露)
潜在局限
- 假设用户已有 Django 基础,新手需配合官方文档理解
- 未涵盖 Django REST framework、Channels 等扩展框架
- 部分优化建议(如
Prefetch)需要 Django 2.0+ 版本
适合人群
- 初级至中级 Django 开发者,希望规避常见错误
- 团队技术负责人制定代码规范时参考
- 面试准备者系统复习 Django 核心机制
常规风险
- 性能优化建议基于常见场景,极端大数据量需配合数据库调优
- 迁移操作具有破坏性,生产环境执行前务必备份
@csrf_exempt等禁用安全措施的操作需充分评估替代方案