2010-08-04 27 views
27

Tôi biết, tôi có thể chạy tìm kiếm phân biệt chữ hoa chữ thường từ DJango ORM. Giống như,đơn đặt hàng không phân biệt chữ hoa chữ cái django-orm bởi

User.objects.filter(first_name__contains="jake") 
User.objects.filter(first_name__contains="sulley") 
User.objects.filter(first_name__icontains="Jake") 
User.objects.filter(first_name__icontains="Sulley") 

Và cũng có thể, tôi có thể lấy chúng như

user_list = User.objects.all().order_by("first_name") 
# sequence: (Jake, Sulley, jake, sulley) 
user_list = User.objects.all().order_by("-first_name") # for reverse 
# sequence: (sulley, jake, Sulley, Jake) 

Có cách nào trực tiếp cho một case-insensitive lấy ?? Vì tôi muốn một chuỗi là

# desired sequence: jake, Jake, sulley, Sulley 

Nếu không, hãy đề xuất cách tốt nhất để làm điều đó. Cảm ơn trước.

Trả lời

23

tôi tìm thấy giải pháp sử dụng .extra

class MyModelName(models.Model): 
    is_mine = models.BooleanField(default=False) 
    name = models.CharField(max_length=100) 


MyModelName.objects.filter(is_mine=1).extra(\ 
    select={'lower_name':'lower(name)'}).order_by('lower_name') 

gốc liên kết:

http://naorrosenberg.blogspot.fi/2011/04/django-models-orderby-charfield-case.html

+1

Điều này sẽ không hoạt động khi đi qua mối quan hệ, tức là "name__something", tuy nhiên bạn có thể làm cho nó hoạt động với hàm Lower kể từ django 1.8: 'từ django.db.models.functions nhập Lower' và 'MyModelName.objects.order_by (Thấp hơn ('name_something')) 'ở đây là https://docs.djangoproject.com/en/1.9/_modules/django/db/models/functions/#Lower – romainm

6

này là dành cho postgresql, nhưng có lẽ nó sẽ hữu ích cho cơ sở dữ liệu khác quá:

http://scottbarnham.com/blog/2007/11/20/case-insensitive-ordering-with-django-and-postgresql/

+0

Nhưng điều này sẽ thất bại với khác DB. Ngoài ra nó sẽ trở nên phức tạp nếu tôi cần phải đặt hàng trên các lĩnh vực từ các bảng tham gia, phải không ?? – simplyharsh

+0

Phải chấp nhận một cách hữu ích nhất. Cảm ơn. – simplyharsh

+0

Bạn không phải chấp nhận bất cứ điều gì, nếu câu trả lời không thỏa mãn bạn. Thật không may, django không cung cấp cơ chế cho những gì bạn muốn ngay bây giờ. Bạn có thể thử làm việc với 'extra' và cách này cố gắng đạt được những gì bạn muốn. Điều này sẽ làm việc trên bất kỳ db. Hoặc bạn có thể viết sql thô. – gruszczy

37

Kể từ Django 1.8 nó có thể với:

from django.db.models.functions import Lower 
MyModel.objects.order_by(Lower('myfield')) 

https://code.djangoproject.com/ticket/6498

+0

Đây là giải pháp tốt hơn cho các phiên bản Django mới. Cảm ơn! – Chris

+0

Có thể sử dụng Thấp hơn với nhiều cột không? Tôi chỉ có thể làm cho nó hoạt động với một cột. – Ben

+0

Có thể: User.objects.order_by (Thấp hơn ('tên người dùng'), Thấp hơn ('email')) –

Các vấn đề liên quan