加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 覆盖Django用户管理器以仅返回查询中的活动用户

发布时间:2020-12-20 13:32:19 所属栏目:Python 来源:网络整理
导读:需要一种方法来调用User.objects.filter / get只返回is_active设置为True的User对象. 我试图定义一个自定义管理器并将其修补到User模型上,如下所示: class CustomUserManager(UserManager): def get_query_set(self): return super(CustomUserManager,self)
需要一种方法来调用User.objects.filter / get只返回is_active设置为True的User对象.

我试图定义一个自定义管理器并将其修补到User模型上,如下所示:

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’对象没有属性’_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,line 621,in filter
    return self._filter_or_exclude(False,*args,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'

解决方法

是否需要将过滤器应用于用户模型?你为什么不尝试子类化这个模型?并为这个模型编写经理代码.

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')

或使用proxy model

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读