Tôi cần thực hiện truy vấn phân biệt chữ hoa chữ thường theo số username
theo mặc định khi sử dụng khung công tác Auth Django.Django: Thực hiện tra cứu phân biệt dạng chữ theo mặc định
tôi đã cố gắng khắc phục vấn đề bằng cách viết một phân lớp tùy chỉnh của Queryset
và trọng phương pháp _filter_or_exclude
và sau đó sử dụng mà phân lớp trong một nhà quản lý tùy chỉnh cho người dùng model-
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()
Nhưng phương pháp này không công việc và tôi gặp lỗi lạ khi tôi thử làm User.objects.get(username='Foo')
.
Mọi trợ giúp sẽ được đánh giá cao.
Cập nhật: Tôi bao gồm lỗi chính xác mà tôi nhận được.
/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'
Cập nhật: Bằng cách này, tôi chỉ muốn đề cập rằng khi tôi copy logic bên trong phương pháp _filter_or_exclude
tôi vào lớp học thực tế QuerySet
, nó hoạt động hoàn hảo.
cũng có thể đăng lỗi đó? –
Đã thêm. Cảm ơn vì đã nhắc nhở. –
Lỗi lạ. Bạn có thể xác minh rằng bạn nhận được lỗi này trên mã chính xác này không? Không có phương pháp bổ sung nào trên QuerySet hoặc Manager bị ghi đè, và không có lớp con bổ sung can thiệp nào trong hệ thống phân cấp thừa kế, không có thêm các mixin? –