Django模型:Meta:如何使默认排序不区分大小写

时间:2017-11-17 10:17:40

标签: django django-models

我有一个Django模型,如下所示:我知道我们可以在Meta类中设置默认排序。

class Ingredient(models.Model):
    name = models.CharField(max_length=200,unique=True,null=False)
    slug = models.SlugField(unique=True)

    class Meta:
        ordering = ["name"]

由于订购在此处设置为名称。我发现的是,它是通过区分大小写的。那么如何使它不区分大小写呢

3 个答案:

答案 0 :(得分:5)

在模型元选项(source)中无法将默认顺序设置为不区分大小写。

您可以使用模型QuerySet的{​​{3}}方法:

from django.db.models.functions import Lower

Ingredient.objects.order_by(Lower('name'))

order_by

中所述

为了能够将其作为默认排序(并避免在每个查询集上重复order_by方法),您可能希望为{{1}创建this answer类} model:

Ingredient

所以你可以订购所有# managers.py from django.db.models.functions import Lower class OrderedIngredientManager(models.Manager): def get_queryset(self): return super().get_queryset().order_by(Lower('name')) # models.py from .managers import OrderedIngredientManager class Ingredient(models.Model): name = models.CharField(max_length=200,unique=True,null=False) slug = models.SlugField(unique=True) ordered_objects = OrderedIngredientManager()

QuerySet

答案 1 :(得分:1)

您可以通过使用Django模型中的F来使用它

from django.db.models import F
class Ingredient(models.Model):
    class Meta:
        ordering = [F('name').asc(nulls_last=True)]

答案 2 :(得分:0)

我使用django 2.0.7进行了测试,并使用Upper Works:

class Ingredient(models.Model):
    class Meta:
        ordering = [Upper('name'), ]
name = models.CharField(max_length=200,unique=True,null=False)