马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
中文排序
在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,没有相互辩论。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |