Django: Führen Sie Groß- und Kleinschreibung Lookups standardmäßig
-
22-08-2019 - |
Frage
ich brauche Groß- und Kleinschreibung Abfragen auf username
standardmäßig auszuführen
wenn die Django Auth-Framework.
Ich habe versucht, das Problem zur Festlegung einer benutzerdefinierten Unterklasse von Queryset
schreiben
und Überschreiben des _filter_or_exclude
Verfahrens und dann verwenden,
Unterklasse in einem benutzerdefinierten Manager für die User-Modell -
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()
Aber dieser Ansatz nicht funktionierte und ich erhalte einen seltsamen Fehler, wenn ich
versuchen User.objects.get(username='Foo')
tun.
Jede mögliche Hilfe würde geschätzt.
Aktualisieren . Ich schließe den genauen Fehler, die ich erhalte
/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'
Aktualisieren :. Übrigens, ich wollte nur erwähnen, dass, wenn ich die Logik in meiner _filter_or_exclude
Methode in die eigentliche QuerySet
Klasse kopieren, es funktioniert einwandfrei
Lösung
Die Manager können nicht in Klassen mit einfacher Attributierung (User.objects = MyManager()
) hinzugefügt werden. Schauen Sie sich die Modelbase metaclass (db / models / base.py), um zu sehen, was alles für Sie hinter den Kulissen geschieht, wenn Sie Modellunterklasse.
Es soll möglich sein, um es mit User.add_to_class('objects', MyManager())
zu arbeiten. Alternativ können Sie eine Proxy-Unterklasse Benutzer und fügen Sie dort den Manager.
Andere Tipps
Sie möchten nicht mit internen Funktionen von Django Klassen zu verwirren. Auf diese Weise liegt Schwierigkeiten mit jedem Upgrade in der Zukunft.
Wenn Sie die Art, wie Menschen authentifizieren ändern möchten, schreiben Sie eine benutzerdefinierte Authentifizierungs-Backend.
Hier sind zwei Rezepte.
http: // www. davidcramer.net/code/224/logging-in-with-email-addresses-in-django.html
http://www.djangosnippets.org/snippets/577/
wir Beide statt Benutzername E-Mail. Es ist nicht schwer Groß- und Kleinschreibung Abfrage statt einer E-Mail-Abfrage zu verwenden.
Hier ist ein Rezept für die Auth-Use-Case: Django: Groß- und Kleinschreibung Abgleich von Benutzernamen von Auth Benutzer ? Sie sind wahrscheinlich am besten dran mit separaten Lösungen für jede Ihrer Anwendungsfälle.