You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:15:02