2014-03-31 125 views
1

我想顯示在不區分大小寫的順序對象如何使用模型管理方法在Django

爲如

class Organization(models.model): 
    name=models.CharField(max_length=50) 
    administrator = models.ForeignKey(User, blank=True,related_name = 'OrgAdmin') 
    types = models.ManyToManyField(OrganizationType,blank=True, null=True) 

顯示按名稱排序的對象獲得的不區分大小寫的順序對象

Organization.objects.all().order_by('name') 

會在區分大小寫時顯示

soo會有什麼選項f或不區分大小寫爲了

如何能夠做到這一點使用模型法

+0

[Django的ORM不區分大小寫的順序由]的可能重複(http://stackoverflow.com/questions/3409047/django-orm-case-insensitive-order-by) –

回答

2

做還可以額外使用:

Organization.objects.extra(select={'lower_name':'lower(name)'}).order_by('lower_name') 

django-orm case-insensitive order by

編輯:

請檢查

Organization.objects.extra(select={'lower_name':'lower(administrator__name)'}).order_by('lower_name') 
+0

我也嘗試過,但它沒有在外鍵字段.. – user2404093

+0

伴侶但在問題中有CharField不是外鍵.. – Silwest

+0

我嘗試以上與外鍵字段。 Organization.objects.filter()額外(選擇= { 'lower_administrator': '下部(管理員)'}).order_by( 'lower_administrator') 給出錯誤 OperationalError:沒有這樣的柱:管理員 – user2404093

0

有一個明顯的區別,你應該在模型管理器模型和什麼做什麼。基本上,模型應該只包含處理單個實例的方法,而應使用自定義模型管理器來包含在模型列表上運行的任何邏輯或執行自定義查詢。

所以,在你的例子這應該是這樣的:

class OrganizationManager(models.Manager): 
    def insensitive(self): 
     return self.all().extra(select={'name_lower': 'lower(name)'}, order_by=['name_lower']) 

class Organization(models.model): 
    objects = OrganizationManager() 

而且你可以使用它像

orgs_insensitive = Organization.objects.insensitive() 

參考Django的model manager文檔的詳細信息。

編輯:原來Django不支持爲了filter現場查找,所以要根據上this ticket最後一個註釋,不區分大小寫的排序應該像

my_model.objects.all().extra(select={'imf': 'UPPER(my_field)'}, order_by=['imf']) 
+0

能downvoter請解釋其中我錯了嗎? – J0HN

+0

嘿@JOHN thnx, 但我試過這個,暴露像 FieldError錯誤:不能解析關鍵字u'name_iexact'字段。選擇是:身份證,姓名,電話...等:( – user2404093

+1

這是你的錯字,不是我的:) – J0HN

0

可以根據外鍵的屬性(如管理員上面提到的)使用原始查詢來獲取不區分大小寫的對象。

Organization.objects.raw('select * from organization o,auth_user a on o.administrator_id=a.id order by a.username COLLATE NOCASE ASC')