Django:默认情况下执行不区分大小写的查找 [英] Django: Perform case-insensitive lookups by default
问题描述
在使用Django Auth框架时,我需要在用户名
中执行不区分大小写的查询
。
I need to perform case-insensitive queries on username
by default
when using the Django Auth framework.
我尝试通过编写 Queryset
的自定义子类来修复问题,并覆盖 _filter_or_exclude
方法,然后在用户模型的自定义管理器中使用
子类 -
I tried fixing the issue by writing a custom subclass of Queryset
and overriding the _filter_or_exclude
method and then using that
subclass in a custom manager for the User model-
from django.db.models import Manager
from django.db.models.query import QuerySet
from django.contrib.auth.models import UserManager
class MyQuerySet(QuerySet):
def _filter_or_exclude(self, negate, *args, **kwargs):
if 'username' in kwargs:
kwargs['username__iexact'] = kwargs['username']
del kwargs['username']
return super(MyQuerySet, self)._filter_or_exclude(negate, *args, **kwargs)
class MyUserManager(UserManager):
def get_query_set(self):
return MyQuerySet(self.model)
User.objects = MyUserManager()
但这种方法没有工作,当我
尝试执行 User.objects.get(username ='Foo')
。
But this approach didn't work and I am getting an weird error when I
try doing User.objects.get(username='Foo')
.
任何帮助将不胜感激。
更新:我正在包括我正在获得的错误。 p>
Update: I am including the exact error that I am getting.
/usr/lib/python2.5/site-packages/django/db/models/query.py in get(self, *args, **kwargs)
295 keyword arguments.
296 """
--> 297 clone = self.filter(*args, **kwargs)
298 num = len(clone)
299 if num == 1:
/usr/lib/python2.5/site-packages/django/db/models/query.py in filter(self, *args, **kwargs)
481 set.
482 """
--> 483 return self._filter_or_exclude(False, *args, **kwargs)
484
485 def exclude(self, *args, **kwargs):
/home/ghoseb/src/git/ocricket.git/ocricket/user/models.py in _filter_or_exclude(self, negate, *args, **kwargs)
38 kwargs['username__iexact'] = kwargs['username']
39 del kwargs['username']
---> 40 return super(MyQuerySet, self)._filter_or_exclude(negate, *args, **kwargs)
41
42 class MyUserManager(UserManager):
/usr/lib/python2.5/site-packages/django/db/models/query.py in _filter_or_exclude(self, negate, *args, **kwargs)
499 clone.query.add_q(~Q(*args, **kwargs))
500 else:
--> 501 clone.query.add_q(Q(*args, **kwargs))
502 return clone
503
/usr/lib/python2.5/django/db/models/sql/query.py in add_q(self, q_object, used_aliases)
/usr/lib/python2.5/django/db/models/sql/query.py in add_filter(self, filter_expr, connector, negate, trim, can_reuse, process_extras)
/usr/lib/python2.5/django/db/models/sql/query.py in get_meta(self)
<type 'exceptions.AttributeError'>: 'NoneType' object has no attribute '_meta'
更新:顺便提一下,当我将 _filter_or_exclude
方法中的逻辑复制到实际的 QuerySet
类,它完美无缺。
Update: By the way, I just wanted to mention that when I copy the logic inside my _filter_or_exclude
method into the actual QuerySet
class, it works flawlessly.
推荐答案
无法将管理员添加到简单属性赋值( User.objects = MyManager()
)。看看ModelBase元类(db / models / base.py),以便在子类Model时查看幕后所做的一切。
Managers can't be added to classes with simple attribute assignment (User.objects = MyManager()
). Look at the ModelBase metaclass (db/models/base.py) to see what all is done for you behind the scenes when you subclass Model.
您应该能够使用 User.add_to_class('objects',MyManager())
。或者,您可以使代理子类用户,并在那里添加经理。
You should be able to make it work with User.add_to_class('objects', MyManager())
. Alternatively, you could make a proxy subclass of User and add the manager there.
这篇关于Django:默认情况下执行不区分大小写的查找的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!