Django4 中文入门教程 Django4.0 管理器-基础管理器

2024-02-25 开发教程 Django4 中文入门教程 匿名 6

Model._base_manager

用于访问关联对象的管理器

默认情况下,Django 访问关联对象(即 ​choice.question​)时使用 ​Model._base_manager​ 管理器类的实例,而不是关联对象的 ​_default_manager​。这是因为 Django 要检索那些可能被默认管理器筛选掉(所以无法访问)的关联对象。

若基本管理器类 (​django.db.models.Manager​) 无法满足需求,你可以通过设置 ​Meta.base_manager_name ​告诉 Django 使用哪个类。

在关联模型上执行查询时不会使用基础管理器,或者当访问一对多或多对多关系。例如,来自教程的模型 ​Question ​有个 ​deleted ​字段,还有一个基础管理器,用于过滤掉 ​deleted=True​ 的实例。由 ​Choice.objects.filter(question__name__startswith='What') ​返回的查询结果集会包含关联至已删除的问题的选项。

不要在这类管理器子类中过滤掉任何结果

该管理器用于访问由其它模型关联过来的对象。这些情况下,Django 要能访问待获取模型的全部对象,这样就能检索出其指向的 任何东西。
因此,你不应该覆盖 ​get_queryset()​ 来过滤任何​rows​。如果你这么做,Django 会返回不完整的结果。