如何在Django类视图/函数视图中使用自定义Manager而非默认objects?
解决方案
第一步:先修复模型代码笔误
你当前models.py中存在拼写错误,会导致调用管理器时报错,先修正:
class Employee(models.Model): # 原错误写法:not_employed = NotEmployedEmployees() 末尾多了s,和定义的管理器类名不一致 not_employed = NotEmployedEmployee() # 修正后写法 name = models.CharField(max_length=250) employed = models.BooleanField(default=True, blank=True, null=True)
类视图指定自定义管理器的方法
Django通用类视图默认调用模型的objects管理器,要切换到自定义管理器,有两种常用方案:
方案1:直接指定queryset属性
适合不需要动态修改查询条件的场景,直接用自定义管理器返回查询集即可:
离职员工列表视图
class NotEmployedEmployeeListView(ListView): # 直接指定使用not_employed管理器的查询集 queryset = Employee.not_employed.all() template_name = 'tmng/employee_not_employed.html' # 如果需要加筛选器,和在职列表逻辑一致即可 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) resultset = EmployeeFilter(self.request.GET, queryset=self.get_queryset()) context['filter'] = resultset return context
离职员工更新视图
如果不重写查询集,UpdateView默认会用objects管理器查询,会找不到离职员工返回404,所以必须指定管理器:
class NotEmployedEmployeeUpdateView(UpdateView): template_name = 'tmng/employee_update.html' # 指定用not_employed管理器查询离职员工 queryset = Employee.not_employed.all() fields = '__all__' def form_valid(self, form): self.name = form.cleaned_data.get('name') return super().form_valid(form) def get_success_url(self): messages.success(self.request, f'员工 "{self.name}" 信息已修改!') return '/'
方案2:重写get_queryset方法
适合需要动态调整查询条件的场景(比如根据登录用户权限过滤数据),灵活性更高:
class NotEmployedEmployeeListView(ListView): model = Employee template_name = 'tmng/employee_not_employed.html' def get_queryset(self): # 直接返回自定义管理器的查询结果即可 return Employee.not_employed.all()
函数视图的用法
你当前写的函数视图已经是正确的用法,直接调用Employee.not_employed.all()就是明确使用not_employed管理器,不需要额外配置。
内容的提问来源于stack exchange,提问作者VdGR
相关产品推荐
相关产品推荐

