用途:该技能用于在 Django 项目中提供开发最佳实践,覆盖模型、视图、URL 路由、模板、表单、admin 与管理命令等场景。
项目结构:遵循标准 Django 应用布局,包含 models.py、views.py、urls.py、admin.py、tests.py、forms.py;每个应用聚焦单一领域概念,避免把无关模型堆进同一个应用;用 settings/base.py、settings/dev.py、settings/prod.py 区分环境配置。
模型:始终为模型定义 str 以便 admin 与调试阅读;谨慎使用 Meta.ordering,因为它会给每个查询加 ORDER BY,优先在 queryset 上显式调用 .order_by();对出现在 filter() / order_by() 中的字段使用数据库索引(db_index=True、Meta.indexes);受限字段优先用带 choices 的 CharField(或 TextChoices / IntegerChoices)而非裸字符串;复杂查询用 F() 表达式和 Q() 对象,避免竞态并提升可读性。
视图:CRUD 优先用类视图(CBV),一次性逻辑优先用函数视图;始终显式设置 queryset 或重写 get_queryset(),不要依赖可变的类级状态;用 select_related() 和 prefetch_related() 避免 N+1 查询;设置 LOGIN_URL 并一致使用 @login_required / LoginRequiredMixin。
测试:用 pytest-django 配合 @pytest.mark.django_db 访问数据库;仅在需要显式事务控制时用 TestCase 或 TransactionTestCase,否则用 pytest fixtures;用 RequestFactory 或 Client 在不启动服务器的情况下测试视图;用 baker.make()(model-bakery)或 factories 代替手工构造模型。
限制与陷阱:异步视图中不要做阻塞 I/O,除非用 sync_to_async 包装;避免在 settings.py 或 urls.py 模块级导入模型(循环导入);不要把密钥存在 settings.py,应使用环境变量;除非 ORM 确实无法表达查询,否则避免原生 SQL。