Django 源码小剖: Django ORM 查询管理器
这篇讲的是 Django ORM 中 `Book.objects` 这类查询入口背后的精巧设计。我们平时写 `Book.objects.filter()` 只图方便,但作者从源码出发,揭示了这行简单代码背后隐藏的机制。 文章首先点明,`objects` 并非 Model 类自带的属性,而是在 Django 启动时,通过 `ensure_default_manager` 函数动态“挂”上去的。真正的查询逻辑由 `Manager` 类承担。 但更巧妙的是 Django 的“保护技法”:`objects` 属性实际上是一个 `ManagerDescriptor` 描述符的实例。它利用 Python 的描述符协议,在 `__get__` 方法中判断访问者是类还是类实例。如果误在对象实例上调用 `book_obj.objects`,会直接抛出 `AttributeError`,确保了语义正确——查询只能从“类”这个集合概念发起,而非从单个数据实例。 作者通过剖析这一层包装,清晰地展现了 Django 如何在工程细节上贯彻设计原则,让 ORM 接口既简洁又严谨。他在 GitHub 上维护的 Django 源码注释项目,也为想深入探索的开发者提供了很好的路径。