如何使用django中的模型管理器方法以不区分大小写的顺序获取对象

时间:2014-03-31 09:06:00

标签: django django-models

我希望以不区分大小写的顺序显示对象

例如

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什么是不区分大小写的顺序的选项

我们如何使用模型方法实现这一目标

3 个答案:

答案 0 :(得分: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')

答案 1 :(得分: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'])

答案 2 :(得分:0)

可以使用原始查询基于外键属性(如上面提到的管理员)获取不区分大小写的对象。

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