4

大文字と小文字を区別しないユーザー名の実装:

iexactをクエリするときに暗黙的に暗示したいuser:

user = User.objects.get(username = 'yugal')  # Lowercase
user.id # 1

user = User.objects.get(username = 'YUgal')  # Mixcase
user.id # 1

どうすればこれを達成できますか? {どういうわけかUserManager}

ノート:

  • としてもdjango.shortcuts.get_object_or_404使うようUser.objects.get_query_set().all().get()です。どうすればそれを機能させることができますか?
4

2 に答える 2

4

明示的:

user = User.objects.get(username__iexact='yugal')

暗黙的:オーバーライドモデルを使用すると、カスタム処理を追加するプロパティUserをオーバーライドできます。objectsiexact

class MyUser(User):

    class Meta:
        proxy = True


    objects = MyManager()


class MyManager(UserManager):

    def get(self, *args, **kwargs):

       if 'username' in kwargs:
           kwargs['username__iexact'] = kwargs['username']
           del kwargs['username']
       return super(MyManager, self).get(*args, **kwargs)
于 2012-11-03T09:26:41.353 に答える
0

私はすべてのデータベースクエリにそれを実装する方法を考え出したと思います:

###### QuerySet #######
def _filter_or_exclude(self, negate, *args, **kwargs):
    if 'username' in kwargs:
        kwargs['username__iexact'] = kwargs['username']
        del kwargs['username']
    if args or kwargs:
        assert self.query.can_filter(),\
        "Cannot filter a query once a slice has been taken."
    from django.db.models import Q
    clone = self._clone()
    if negate:
        clone.query.add_q(~Q(*args, **kwargs))
    else:
        clone.query.add_q(Q(*args, **kwargs))
    return clone

from django.db.models.query import QuerySet
QuerySet._filter_or_exclude = _filter_or_exclude
######################

これで問題は解決しました。

于 2012-11-03T11:07:57.240 に答える