基于整数 Django ORM 的排序

Ordering On basis of Integer Django ORM

我正在使用此代码进行订购,它在 Name、url 等情况下工作正常但我想根据 id(它是整数字段)进行订购,但我收到此错误

函数 lower(integer) 不存在 第 1 行:...ws_sources_newssource"."deleted" IS NULL ORDER BY LOWER("new...

而且我的代码和fellow一样

class CaseInsensitiveOrderingFilter(OrderingFilter):

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

        if ordering:
            new_ordering = []
            for field in ordering:
                if field.startswith('-'):
                    new_ordering.append(Lower(field[1:]).desc())
                else:
                    new_ordering.append(Lower(field).asc())
            return queryset.order_by(*new_ordering)

        return queryset

然后在ListView中使用它

class IngredientListAPIView(ListAPIView):
       search_fields = ['name']
       queryset = models.NewsData.objects.all()
filter_backends =(filters.SearchFilter,CaseInsensitiveOrderingFilter,)
ordering_fields = ['id','name','url','language__name','count','key_journalists',]
ordering = ('name')

错误消息很明确,您不能对整数使用函数 lower()。 Sqlite 并没有真正的类型,所以数据以字符串形式返回。 Postgres 确实有类型并且 field 以整数形式返回。您需要明确地将 field 转换为 str(field)

更新 如果您想按整数排序,则类似于:

if ordering:
    return queryset.order_by(field)