中文排序
在Django中使用ORM进行中文排序时,可以通过几种方法来实现。一种常见的方法是使用
extra()
函数配合order_by()
来进行排序。例如,如果需要对models.EnterpriseInfo.objects.all()
中的name
字段进行中文排序,可以使用以下方式:
models.EnterpriseInfo.objects.extra(select={'name_pinyin': "CONVERT(name USING GBK)"}).order_by('name_pinyin')
这行代码通过
extra()
函数添加了一个名为name_pinyin
的字段,该字段是通过将name
字段转换为GBK编码实现的,然后通过order_by('name_pinyin')
对结果进行排序。这种方法利用了数据库的特定函数来实现中文排序,适用于MySQL等支持字符集转换的数据库。另一种方法是使用字符串函数对中文进行排序。例如,如果需要根据字段的前几个字符进行排序,可以使用
left()
函数(在MySQL中)来提取字符串的开头部分,并在查询中进行排序。例如:
PurchaseGoods.objects.extra(select={'goods_name_seq': "left(goods_name, 2)"}).order_by('goods_name_seq')
这行代码通过
extra()
函数添加了一个计算字段goods_name_seq
,该字段是goods_name
字段的前两个字符,然后通过order_by('goods_name_seq')
对结果进行排序。这种方法适用于需要对中文名称的某一部分进行排序的场景。需要注意的是,这些方法都依赖于数据库的具体实现和字符集支持。不同的数据库可能有不同的函数和语法来实现中文排序。因此,具体的实现方式需要根据所使用的数据库进行调整。此外,这些方法也适用于其他ORM框架,不仅仅是Django,只要遵循相应的数据库函数和语法规则即可实现中文排序
orm排序
在ORM(对象关系映射)中进行排序通常涉及使用特定的方法或函数来指定排序规则。以下是一些常见的ORM框架中的排序方法:
-
SQLAlchemy(Python) : 使用
order_by
方法指定排序的字段,通过在字段名前加"-"来表示降序排序,或者使用desc()
方法来实现降序。例如:session.query(模型类).order_by(模型类.字段名).all() # 正序排序 session.query(模型类).order_by(模型类.字段名.desc()).all() # 降序排序
-
Django ORM : 同样使用
order_by
方法来排序,可以链式调用多个字段进行排序,或者使用desc()
来指定降序。例如:Item.objects.order_by('field_name') # 正序排序 Item.objects.order_by('-field_name') # 降序排序
此外,Django还支持使用
Case
和When
来进行更复杂的自定义排序,例如:from django.db.models import Case, Value, When qs = Item.objects.annotate( sort_order=Case( When(type=ItemType.A, then=Value(0)), When(type=ItemType.B, then=Value(1)), When(type=ItemType.C, then=Value(2)), default=Value(3), output_field=IntegerField()), ).order_by('sort_order')
这些方法允许开发者在查询数据库时灵活地控制数据的排序方式,无论是简单的单字段排序还是复杂的条件排序。
排序OrderingFilter类
使用
OrderingFilter
类首先要把它加入到filter_backends
, 然后指定排序字段即可,如下所示:
from rest_framework import filters
class ArticleList(generics.ListCreateAPIView):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
pagination_class = MyPageNumberPagination
filter_backends = (filters.SearchFilter, filters.OrderingFilter,)
search_fields = ('title',)
ordering_fields = ('create_date')
发送请求时只需要在参数上加上?ordering=create_date或者?ordering=-create_date即可实现对结果按文章创建时间正序和逆序进行排序。
注意 :实际开发应用中OrderingFilter类,SearchFilter类和DjangoFilterBackend经常一起联用作为DRF的
filter_backends
,没有相互冲突。