Necesito realizar consultas que no distingan entre mayúsculas y minúsculas en username
de forma predeterminada cuando uso el marco de Django Auth.Django: realizar búsquedas en mayúsculas y minúsculas de manera predeterminada
He intentado solucionar la incidencia escribiendo una subclase personalizada de Queryset
y reemplazando el método _filter_or_exclude
y luego usar esa subclase en un gestor personalizado para el usuario modelo-
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()
Pero este enfoque no lo hicieron trabajo y recibo un extraño error cuando intento hacer User.objects.get(username='Foo')
.
Cualquier ayuda sería apreciada.
Actualización: Estoy incluyendo el error exacto que estoy recibiendo.
/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'
actualización: Por cierto, sólo quería mencionar que cuando copio la lógica dentro de mi método _filter_or_exclude
en la clase real QuerySet
, funciona perfectamente.
¿Podría publicar el error también? –
Agregado. Gracias por recordar. –
Extraño error. ¿Puedes verificar que obtienes este error en este código exacto? No hay métodos adicionales en QuerySet o Manager reemplazados, y no hay subclases intermedias adicionales en la jerarquía de herencia, no hay mixins adicionales? –