orm排序

中文排序

在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还支持使用CaseWhen来进行更复杂的自定义排序,例如:

    复制代码
    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,没有相互冲突。

相关推荐
2603_965148114 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
ltl4 小时前
RocksDB 经典故障排查:L0、compaction 与 write stall
数据库
xfhuangfu5 小时前
Oracle中建立到CDB和PDB的连接
数据库·oracle·rpc
小小龙学IT5 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
NineData5 小时前
DTCC 2026 预告|NineData CEO& 创始人叶正盛:面向 AI Agent 的数据库 DevOps 与数据复制实践
数据库·人工智能·数据库开发·devops·ninedata·数据库技术·dtcc
J_bean6 小时前
MySQL 事务是否必须手动开启?
数据库·mysql·数据库事务·自动提交·手动提交
J_bean6 小时前
MySQL InnoDB 如何检测死锁、判定死锁、处理死锁
数据库·mysql·死锁·死锁检测·处理死锁·死锁判定
浪子明X6 小时前
从 MongoDB 文档到关系模型:构建可重跑、可对账的数据迁移流水线
数据库·mongodb·oracle
杜子不疼.7 小时前
国产数据库撑起固井软件自主化:金仓 × 中海油服「海恒 Cemsol」落地解析
数据库
隔窗听雨眠7 小时前
GBase 8s并发控制深度解析:封锁机制、隔离级别与死锁处理全攻略
服务器·数据库·oracle