基于整数Django ORM的订购 [英] Ordering On basis of Integer Django ORM

查看:83
本文介绍了基于整数Django ORM的订购的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用此代码进行排序,它可以在Name,url等情况下正常工作,但是我想根据id(它是整数字段)进行排序,并且出现此错误

I am using this code for ordering , its working fine on case of Name, url etc But I want to order on basis of id (which is integer field) and I get this error

下位函数(整数)不存在
第1行:... ws_sources_newssource。已删除是LOWER BY LOWER( new ...

并且我的代码是同位

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)

The error message is explicit, you cannot use function lower() on an integer. Sqlite does not really have types, so the data came back as string. Postgres does have types and field is coming back as an integer. You will need to explicitly cast field as str(field)

更新
如果要按整数排序,则类似以下内容:

UPDATE If you want to sort by integer then something like:

if ordering:
    return queryset.order_by(field)

这篇关于基于整数Django ORM的订购的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆