Python 重写Django用户管理器以仅返回查询中的活动用户

Python 重写Django用户管理器以仅返回查询中的活动用户,python,django,django-models,django-queryset,Python,Django,Django Models,Django Queryset,需要一种方法来调用User.objects.filter/get以仅返回处于活动状态的用户对象 我尝试定义一个自定义管理器,并将其安装到用户模型上,如下所示: class CustomUserManager(UserManager): def get_query_set(self): return super(CustomUserManager, self).get_query_set(). filter(is_active=True) User.

需要一种方法来调用
User.objects.filter/get
以仅返回
处于活动状态的用户对象

我尝试定义一个自定义管理器,并将其安装到用户模型上,如下所示:

class CustomUserManager(UserManager):

    def get_query_set(self):
        return super(CustomUserManager, self).get_query_set().
          filter(is_active=True)

User.objects = CustomUserManager()
User.objects_all = UserManager()
但是,当我尝试调用User.objects.get()时,我得到:
AttributeError:'NoneType'对象没有属性'\u meta'

在我进一步讨论之前,我想说,我知道这样的猴子补丁在可维护性方面是非常糟糕的形式——这将被标记为稍后重新讨论,但现在我们需要一个快速的解决方案

这是完整的堆栈跟踪,如果有人也需要的话:

  File "<console>", line 1, in <module>
  File "/Users/zarathustra/Virtual_Envs/fierce-spring-7383/venv/lib/python2.7/site-packages/django/db/models/manager.py", line 131, in get
    return self.get_query_set().get(*args, **kwargs)
  File "/Users/zarathustra/Virtual_Envs/fierce-spring-7383/venv/lib/python2.7/site-packages/django/db/models/query.py", line 358, in get
    clone = self.filter(*args, **kwargs)
  File "/Users/zarathustra/Virtual_Envs/fierce-spring-7383/venv/lib/python2.7/site-packages/django/db/models/query.py", line 621, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/Users/zarathustra/Virtual_Envs/fierce-spring-7383/venv/lib/python2.7/site-packages/django/db/models/query.py", line 639, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/Users/zarathustra/Virtual_Envs/fierce-spring-7383/venv/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1250, in add_q
    can_reuse=used_aliases, force_having=force_having)
  File "/Users/zarathustra/Virtual_Envs/fierce-spring-7383/venv/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1114, in add_filter
    opts = self.get_meta()
  File "/Users/zarathustra/Virtual_Envs/fierce-spring-7383/venv/lib/python2.7/site-packages/django/db/models/sql/query.py", line 233, in get_meta
    return self.model._meta
AttributeError: 'NoneType' object has no attribute '_meta'
文件“”,第1行,在
文件“/Users/zarathustra/Virtual_Envs/wear-spring-7383/venv/lib/python2.7/site packages/django/db/models/manager.py”,get中第131行
返回self.get\u query\u set().get(*args,**kwargs)
文件“/Users/zarathustra/Virtual_Envs/wear-spring-7383/venv/lib/python2.7/site packages/django/db/models/query.py”,第358行,在get中
clone=self.filter(*args,**kwargs)
文件“/Users/zarathustra/Virtual_Envs/wear-spring-7383/venv/lib/python2.7/site packages/django/db/models/query.py”,第621行,在过滤器中
返回self.\u filter\u或\u exclude(False、*args、**kwargs)
文件“/Users/zarathustra/Virtual_Envs/viouse-spring-7383/venv/lib/python2.7/site packages/django/db/models/query.py”,第639行,在“过滤器”或“排除”中
clone.query.add_q(q(*args,**kwargs))
文件“/Users/zarathustra/Virtual_Envs/wear-spring-7383/venv/lib/python2.7/site packages/django/db/models/sql/query.py”,第1250行,在add_q中
can_reuse=使用的_别名,force_having=force_having)
文件“/Users/zarathustra/Virtual_Envs/viouse-spring-7383/venv/lib/python2.7/site packages/django/db/models/sql/query.py”,第1114行,添加过滤器
opts=self.get_meta()
文件“/Users/zarathustra/Virtual_Envs/wear-spring-7383/venv/lib/python2.7/site packages/django/db/models/sql/query.py”,第233行,在get_meta中
返回self.model.\u meta
AttributeError:“非类型”对象没有属性“\u meta”

在中找到了答案。由于他的问题是具体的,我的问题是一般的,我不认为它们是重复的,但是对他的问题的回答也回答了我的问题。

< P>这是将过滤器应用到用户模型的要求吗?为什么不尝试将此模型子类化,并为此模型编写一个管理器

class CustomUserManager(UserManager):

    def get_query_set(self):
        return super(CustomUserManager, self).get_query_set().
          filter(is_active=True)


class MyUser(User):
    objects = CustomUserManager()

# get an active user which username is 'foo'
MyUser.objects.get(username='foo')

或者使用

这肯定是更好的方法。因为我们的截止日期很紧,我不想通过改变我们所有与用户相关的代码所使用的模型来引入bug,所以我选择了不同的解决方案。但是如果有其他人在我的船上,我会考虑使用这个。