orm排序

[复制链接]
发表于 2026-2-10 23:54:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
中文排序

   在Django中使用ORM举行中文排序时,‌可以通过几种方法来实现。‌一种常见的方法是使用extra()函数共同order_by()来举行排序。‌比方,‌假如须要对models.EnterpriseInfo.objects.all()中的name字段举行中文排序,‌可以使用以下方式:‌
  1. 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中)‌来提取字符串的开头部门,‌并在查询中举行排序。‌比方:‌
  1. 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()方法来实现降序。比方:
    1. session.query(模型类).order_by(模型类.字段名).all()  # 正序排序
    2. session.query(模型类).order_by(模型类.字段名.desc()).all()  # 降序排序
    复制代码
  • ‌Django ORM: 同样使用order_by方法来排序,可以链式调用多个字段举行排序,大概使用desc()来指定降序。比方:
    1. Item.objects.order_by('field_name')  # 正序排序
    2. Item.objects.order_by('-field_name')  # 降序排序
    复制代码
          别的,Django还支持使用Case和When来举行更复杂的自界说排序,比方:
       
    1. from django.db.models import Case, Value, When
    2. qs = Item.objects.annotate(
    3.    sort_order=Case(
    4.        When(type=ItemType.A, then=Value(0)),
    5.        When(type=ItemType.B, then=Value(1)),
    6.        When(type=ItemType.C, then=Value(2)),
    7.        default=Value(3), output_field=IntegerField()),
    8.    ).order_by('sort_order')
    复制代码
          这些方法答应开辟者在查询数据库时机动地控制数据的排序方式,无论是简朴的单字段排序照旧复杂的条件排序。
排序OrderingFilter类

   使用OrderingFilter类起主要把它参加到filter_backends, 然后指定排序字段即可,如下所示:
  1. from rest_framework import filters
  2. class ArticleList(generics.ListCreateAPIView):
  3.    queryset = Article.objects.all()
  4.    serializer_class = ArticleSerializer
  5.    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
  6.    pagination_class = MyPageNumberPagination
  7.    filter_backends = (filters.SearchFilter, filters.OrderingFilter,)
  8.    search_fields = ('title',)
  9.    ordering_fields = ('create_date')
复制代码
  发送哀求时只须要在参数上加上?ordering=create_date大概?ordering=-create_date即可实现对效果按文章创建时间正序和逆序举行排序。
  注意:实际开辟应用中OrderingFilter类,SearchFilter类和DjangoFilterBackend经常一起联用作为DRF的filter_backends,没有相互辩论。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表