2009-02-10 24 views
6

Numaraya duyarsız aramaları gerçekleştirme Django Auth çerçevesini kullanırken username numaralı numaralı belgede büyük/küçük harf duyarlı olmayan sorgulamalar yapmam gerekiyor. Django: Varsayılan olarak

Ben Kullanıcı model aracın

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() 

için özel bir yöneticisi alt sınıf Ama bu yaklaşım değildir yaptığını kullanarak sonra Queryset özel bir alt sınıfını yazma ve _filter_or_exclude yöntemi geçersiz ve sorunu tespit çalıştı User.objects.get(username='Foo') yapmayı denediğimde iş ve garip bir hata alıyorum.

Herhangi bir yardım için teşekkür ederiz.

Güncelleştirme: Başlarken tam hata ekliyorum.

/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' 

Güncelleme: Bu arada, ben sadece gerçek QuerySet sınıfa benim _filter_or_exclude yöntemi içinde mantığı kopyaladığınızda, kusursuz işlemektedir hatırlatmak istedik.

+0

hata da verebilir mi? –

+0

Eklendi. Hatırlattığın için sağol. –

+0

Garip bir hata. Bu hatayı bu kod üzerinde aldığınızı doğrulayabilir misiniz? QuerySet veya Manager geçersiz kılma konusunda ek yöntemler ve miras hiyerarşisinde ek araya giren alt sınıflar yok, ek karışma yok mu? –

cevap

4

Yöneticiler, basit öznitelik ataması (User.objects = MyManager()) ile sınıflara eklenemez. Model alt sınıfını kullandığınızda sahnelerin ardında sizin için neler yapıldığını görmek için ModelBase metaclass (db/models/base.py) 'a bakın.

User.add_to_class('objects', MyManager()) ile çalışabilmeniz gerekir. Alternatif olarak, bir proxy subclass Kullanıcı yapabilir ve yöneticiyi oraya ekleyebilirsiniz.

+0

Somut bir sınıfın soyut bir alt sınıfına izin verildiğinden veya mantıklı geldiğinden emin değilim, ancak bir proxy modeli iyi çalışır bu durumda. –

+0

@rz Proxy modelleri bu cevap yazıldığı zaman mevcut değildi :-) Onu güncelleyeceğim. –

+0

havalı! Yeni edindiğim düzenleme süper güçlerini kullanmalıydım ve bunu senin için yaptım. Bu arada, Carl, müdürü eklediği yolun dışında, büyük küçük harf duyarlı ve hassas olmayan bir mağazaya sahip olmak için bu yaklaşım doğru mu? –

5

Django sınıflarının iç özellikleriyle uğraşmak istemezsiniz. Bu şekilde gelecekte her yükseltme ile ilgili sorun var.

Kişilerin kimlik doğrulama şeklini değiştirmek isterseniz, özel bir kimlik doğrulama arka sonu yazın.

İşte iki tarif var.

http://www.davidcramer.net/code/224/logging-in-with-email-addresses-in-django.html

http://www.djangosnippets.org/snippets/577/

bize yerine kullanıcı adı eposta Bunların her ikisi de. Bir e-posta sorgusu yerine büyük/küçük harfe duyarlı sorgu kullanmak zor değildir.

+0

Peki, özel yetkin arka uçların farkındayım ama ben Bunu sadece (yalnızca) auth için değil, diğer şeylerde, URL'lerde kullanılan kullanıcı adları gibi, vb. –

İlgili konular