#!关于Django模型中列排序的问题,我将从基础概念到具体实现进行完整说明:
class Meta:
ordering = ['created_at'] # 升序
# ordering = ['-created_at'] # 降序
(2) 多字段排序:
class Meta:
ordering = ['is_pinned', '-created_at'] # 先按置顶升序,再按创建时间降序
问题1:排序影响性能 原因:对未索引字段排序会导致全表扫描 解决:
class Meta:
indexes = [
models.Index(fields=['created_at']),
]
问题2:动态排序需求 原因:Meta ordering是静态的 解决:使用order_by()覆盖:
# 视图中的动态排序
Product.objects.all().order_by(request.GET.get('sort', 'name'))
问题3:关联模型排序 解决:使用双下划线语法:
ordering = ['category__name', 'price']
from django.db.models import Case, When
queryset.annotate(
custom_order=Case(
When(status='urgent', then=0),
When(status='normal', then=1),
default=2
)
).order_by('custom_order')
(2) 随机排序:
from django.db.models.functions import Random
MyModel.objects.all().order_by(Random())
class ModelTests(TestCase):
def test_ordering(self):
obj1 = MyModel.objects.create(field='A')
obj2 = MyModel.objects.create(field='B')
self.assertEqual(list(MyModel.objects.all()), [obj1, obj2])
这种排序机制适用于大多数关系型数据库后端,但某些高级特性(如nulls_first)可能需要特定数据库支持。
没有搜到相关的文章