我喜欢 Django 的地方
Django 被广泛认为是一个出色的 Web 框架,因其稳定性、长期向后兼容性、强大的 ORM,以及内置的 admin 界面和扎实的文档而备受赞赏。评论者强调,它那种“无聊但可靠”的渐进式演进减少了重写成本,使其特别适合大型、长生命周期产品,同时仍然允许通过原始 SQL、替代架构或外部服务来绕开限制。批评主要集中在 Active Record 风格的 ORM(以及容易出现 N+1 查询)、异步和性能限制、相较于无服务器栈更复杂的部署,以及它与 Rails、FastAPI 和 Phoenix 等框架在理念上的差异。
总体感受
- 许多评论者对 Django 非常正面:称其“设计良好”、“以一种好的方式很无聊”,而且对小型和大型应用都很高效。
- 一个反复出现的主题是长期稳定性:多年的、甚至数十年的项目在跨越主要版本升级时,破坏极少。
提到的核心优势
- 没有剧烈变化:与那些迫使重写的框架相比,缓慢、谨慎的演进非常受重视。
- ORM + 迁移:因其强大和灵活而广受赞誉;既能表达复杂 SQL,也有原始 SQL 逃生口。
- Admin:经常能“卖”给客户 Django,也会被复用为内部后台或数据检查器。
- 灵活性:被视为有主见但不死板;很容易覆盖行为、自定义路由、使用 Jinja2、接入其他 ORM,或与其他服务分工(例如用 Rust APIs,Django 负责迁移/admin)。
- 生态系统:DRF + OpenAPI + TS 生成器、django-allauth、单文件工具,以及像 django-bolt 这样的 Rust 前端都获得了好评。
痛点与批评
- ORM / ActiveRecord:
- 批评:鼓励“到处”写查询,容易出现 N+1 问题,加载范围过宽;一些人不喜欢 ActiveRecord 模式;
field__gte这类语法以及字符串式关系被认为丑陋 / 脆弱。 - 辩护:N+1 可以通过
select_related/prefetch_related、即将到来的获取模式以及自律来处理。有人认为这些抱怨更多是“技能 / 匹配”问题。
- 批评:鼓励“到处”写查询,容易出现 N+1 问题,加载范围过宽;一些人不喜欢 ActiveRecord 模式;
- 架构与应用结构:
- 担心跨应用查询、巨大的
models.py/views.py,以及缺乏清晰的服务层会导致意大利面式代码。 - 另一些人主张明确的 service/selector 层、用 signals 解耦,以及“星形”核心 / 聚合应用。signals 被视为强大但有风险,因为它会带来隐藏副作用。
- 担心跨应用查询、巨大的
- Content Types:很令人印象深刻,但也有人警告不要为了长期可维护性而依赖它。
与 Rails 的比较及政治话题
- 有些人从技术角度更偏好 Django 而非 Rails(更少“Rails Way”,更灵活)。
- 另一个分支讨论是否应因 Rails 创始人的公开观点而避免使用 Rails;也有人主张将软件与作者政治分开,或者指出选择性抵制存在不一致。
异步、性能、部署
- 异步方案和高吞吐性能被认为是较弱项;因此有些人会为了这些需求转向 Go 或其他技术栈。
- 与静态前端 / 微服务相比,部署被认为更困难,因为 Django 需要一个 24/7 运行的服务器进程。