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()时,我得到: 在我进一步讨论之前,我想说我知道像这样的猴子修补在可维护性方面是非常糟糕的 – 这将标记为稍后重新审视,但是现在我们需要一个快速的解决方案. 这是完整的堆栈跟踪,如果有人也想要这样: 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |