基于整数Django ORM的订购 [英] Ordering On basis of Integer 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屋!