Django多对象管理器求值逻辑及默认管理器调整问题
Django多对象管理器的求值规则及默认管理器修改方案
一、多个对象管理器的求值逻辑
Django对自定义管理器的优先级规则是固定的:
- 模型中第一个被定义的管理器会被自动识别为全局默认管理器,对应模型的
_default_manager属性 - 其余自定义管理器仅在你显式调用时才会生效,不会影响默认查询行为
- 你给出的示例中
published管理器定义在objects之前,所以published会被作为默认管理器使用,而Django Admin默认调用模型的_default_manager做数据查询,所以才会仅展示已发布内容
二、修改默认管理器的方案
方案1:全局修改默认管理器为objects
直接调整两个管理器的定义顺序即可,Django会将第一个声明的管理器设为默认:
class Post(models.Model): ... objects = models.Manager() # 放在第一位,即成为全局默认管理器 published = PublishedPostManager()
修改后所有默认ORM查询都会使用无额外筛选、排序规则的objects管理器,Admin也会自动同步展示全部内容。
方案2:仅修改Admin的查询规则,保留原有默认管理器
如果不想改动全局默认管理器的优先级,仅需要Admin展示全部内容,可以在对应ModelAdmin中重写get_queryset方法,显式指定调用objects管理器:
from django.contrib import admin from .models import Post class PostAdmin(admin.ModelAdmin): def get_queryset(self, request): # 显式调用objects管理器查询,绕过默认管理器的筛选规则 return Post.objects.all() admin.site.register(Post, PostAdmin)
内容的提问来源于stack exchange,提问作者smrf
相关产品推荐
相关产品推荐

