在我的Django Rest Framework项目中,我有一个自定义filter_backends,它允许不区分大小写地进行过滤:
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:
# field = str(field)
print(Lower(field))
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
这在开发中很有效。
现在我在elastic beanstalk上托管了django应用程序,并通过亚马逊关系数据库服务(RDS)配置了postgresql数据库。
当我现在尝试调用API时,我得到这个错误:
编程错误位于/API/profile_list/ function lower(bigint)不存在行1:...".“作者ID”)分组依据“用户用户”.“ID”排序依据较低(COUN...
提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。
此错误仅出现在RDS部署中。
我试着在django中使用以下命令来对字段进行类型转换:
field = str(field)
但是这并不起作用,有没有什么方法可以在没有lower函数的情况下允许不区分大小写的排序,或者我如何有条件地检查它是一个数字(然后强制转换?)还是文本abd
2条答案
按热度按时间bnl4lu3b1#
出现这个错误是因为你在一个可能是
IntegerField
或其他类型的字段上使用了Lower
,你想在实际使用Lower
之前检查一下你的字段是什么:hxzsmxv22#
要回答此评论中的附加问题:
我想知道为什么这段代码可以在我的本地db. sqlite上工作,而不能在RDS上工作...
PostgreSQL
lower
函数(用于RDS)仅接受文本值。SQLite
lower
函数也接受整数,尽管文档中没有明确提到。这可能与"SQLite uses a more general dynamic type system."有关。另请参见this SO answer。
这说明了为什么在本地和生产中使用相同的RDBMS是有利的。
注:
尽管SQLite在执行以下操作时不会发出抱怨
结果可能令人惊讶,因为它将在lexicographic order中。
例如
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
将作为文本排序,从而产生
[1, 10, 11, 12, 2, 3, 4, 5, 6, 7, 8, 9]