Django:默认情况下执行不区分大小写的查找 [英] Django: Perform case-insensitive lookups by default

查看:881
本文介绍了Django:默认情况下执行不区分大小写的查找的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆