下午好,请告诉我如何按字母升序排列数据!但条件是具有值""的条目在列表的末尾.以下是代码中传达含义的部分-

    def order_by_custom_fields(self, ordering: list):
        result = []
        field_empty_first = Case(
            When(field__exact='', then=0),
            default=1
        )
        for field in ('field'):
            if field in ordering:
                result.append(field_empty_first)

        return result

    def get_ordering(self, request, queryset, view):
        params = request.query_params.get(self.ordering_param)
        if params:
            fields = [param.strip() for param in params.split(',')]
            ordering = self.remove_invalid_fields(queryset, fields, view, request)
        else:
            ordering = []
        ordering.extend(self.order_by_custom_fields(ordering))
        return tuple(
            self.filters_custom_ordering(ordering)
        )

    def filter_queryset(self, request, queryset, view):
        ordering = self.get_ordering(request, queryset, view)

        if ordering:
            return queryset.order_by(*ordering)

        return queryset

此选项显示的记录末尾带有‘’,但顺序不是按字母顺序排列

但这是必要的

Update:也许有一些类似的 Nulls_last=只有‘’值记录时为True?也许我在寻找这个选项时误读了文档. Update2:显然,您必须将数据库中的字段从‘’更改为空

推荐答案

您可以使用Django ORM Coalesce函数

from django.db.models import Case, When
from django.db.models.functions import Coalesce

def order_by_custom_fields(self, ordering: list):
    order_by_fields = []
    for field in ordering:
        if field == 'field':
            order_by_fields.append(Coalesce('field', ''))  # replace empty string with null
            order_by_fields.append('-field')  # add descending order by field
    return order_by_fields

def get_ordering(self, request, queryset, view):
    params = request.query_params.get(self.ordering_param)
    if params:
        fields = [param.strip() for param in params.split(',')]
        ordering = self.remove_invalid_fields(queryset, fields, view, request)
    else:
        ordering = []
    ordering.extend(self.order_by_custom_fields(ordering))
    return tuple(self.filters_custom_ordering(ordering))

def filter_queryset(self, request, queryset, view):
    ordering = self.get_ordering(request, queryset, view)
    if ordering:
        return queryset.order_by(*ordering)
    return queryset

您需要将数据库中的字段从''更改为null,或者使用不同的值而不是''来表示空字段,例如'-'.

您可以将ORDER_BY_CUSTOM_FIELS方法修改为对ORDER_BY方法使用nulls_last=True选项,如下所示:

from django.db.models import Case, When
from django.db.models.functions import Coalesce

def order_by_custom_fields(self, ordering: list):
    result = []
    for field in ('field'):
        if field in ordering:
            result.append(Case(
                When(field='', then=None),
                default=field,
                output_field=CharField()
            ))
    result.append(Coalesce('field', '')) # Using Coalesce to sort empty fields last
    result.append('id') # Can add additional field to break ties
    return result

Python-3.x相关问答推荐

使用Python装载. iso文件

如何创建多个日志(log)文件

如何在选中项目时设置QTreeView中整行的 colored颜色 ?

如果行在所有上级索引中都为0,如何删除下级索引行?

PySpark每毫秒使用先前的值填充数据

根据第一个字典的值序列对第二个字典进行排序

合并两个数据帧并对某些总和进行求和

在python内的powershell中转义$_

Jupyter Notebook 拒绝打印一些字符串

Python pandas将单元格值移动到同一行中的另一个单元格

集合操作:应该只适用于集合,但适用于 dict_keys?

Pandas 值列中列表中元素的计数

`pyspark mllib` 与 `pyspark ml` 包

ImportError:没有名为资源的模块

在气流中运行 DAG 时出现处理信号:ttou消息

在 Python 3.5 中使用 aiohttp 获取多个 url

如何在 Python3 中添加带有标志的命令行参数?

如何在 python 3.x 中禁用 ssl 判断?

从 IPython 重新加载 Python 扩展模块

交错4个相同长度的python列表