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

San*_*idi 0 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"]
Run Code Online (Sandbox Code Playgroud)

由于订购设置在这里命名.我发现的是,它是通过区分大小写的.那么如何使它不区分大小写

Bry*_*tte 9

我使用 django 2.0.7 进行测试并使用 Upper 作品:

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

  • 从 django.db.models.functions 导入上层 (3认同)

Clé*_*oix 6

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

你可以做的是使用你的模型的order_by方法QuerySet:

from django.db.models.functions import Lower

Ingredient.objects.order_by(Lower('name'))
Run Code Online (Sandbox Code Playgroud)

正如本答案所述

为了能够将其作为默认排序(并避免order_by在每个查询集上重复该方法),您可能希望为模型创建自定义ManagerIngredient:

# 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()
Run Code Online (Sandbox Code Playgroud)

所以你可以QuerySet订购所有订单:

Ingredient.ordered_objects.all()
Run Code Online (Sandbox Code Playgroud)