2012-11-03 131 views
3

實現用戶名不區分大小寫:Django:默認情況下如何過濾使用username__iexact的用戶?

我想含蓄暗示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()。我們如何使它工作?
+0

btw:通常不會更好地將DB中的所有用戶名以小寫字母存儲,並將它們查詢爲User.objects.get(username ='YuGal'.lower())? – yedpodtrzitko

+0

事情是:'.lower()'是我的代碼的解決方案。但不適用於第三方應用程序。因爲他們可能沒有使用'.lower()' –

回答

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 
###################### 

這解決了這個問題。

+0

這個解決方案可能會讓一些人反感,但爲了達到理想的效果 - 這是唯一可能的解決方案,但副作用最小。如果有人有更好的解決方案 - 請隨時添加答案。請記住,它必須支持開箱即用的第三方應用程序。 –

3

明確:

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

隱:覆蓋User模型讓您可以覆蓋objects屬性,在這裏添加自定義iexact處理:

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) 
+0

似乎是對的,讓我試着回去。 –

+0

所有似乎工作,但它不與'django.shortcuts.get_object_or_404'工作。我們可以讓這項工作爲用戶名假設'iexact'嗎? –

+0

@YugalJindle你可以顯示代碼如何使用'get_object_or_404'? – yedpodtrzitko

相關問題