我有一个问题,我想在Django管理中根据字符串中的数字对模型行进行排序并忽略字母 - 如XX0345XX,X0346XXX,XXX0347XX。我想我应该为此使用正则表达式。我有一个SQL查询(PostgreSQL),它返回我想要的东西:select * from mytable order by substring(my_field, '\d+')::int DESC但是我在应用它以获得相同的结果时遇到了麻烦 Django管理员 。我尝试过做这样的事情:get_queryset()def get_queryset():
return Model.objects.raw("select * from mytable order by substring(my_field, '\d+')::int DESC")但问题是我没有以这种方式返回正确的类型。 返回 ,但应该返回实例而不是一个,所以我不能这样做。Model.objects.raw('...')RawQuerySetget_queryset()QuerySetRawQuerySet关于如何解决这个问题的任何建议?谢谢!
2 回答
智慧大石
TA贡献1946条经验 获得超3个赞
慕侠2389804
TA贡献1719条经验 获得超6个赞
正如@Azy_Crw4282所指出的那样,您可以使用 来运行原始 SQL 查询,并且仍然可以将结果作为实例返回。QuerySet.extra()QuerySet
以下是我如何设法在管理视图中的对象上执行基于正则表达式的“ORDER BY”,基于字符串中的数字。即,像XX0345XX,X0346XXX,XXX0347XX这样的顺序字段,基于它们包含的数字 - 基本上得到一个与正则表达式匹配的子字符串。'\d+'
只需重写类中的函数即可。get_queryset()admin.ModelAdmin
溶液:
def get_queryset(self, request):
sql_query = "CAST(substring(booking_reference, '\d+') as int)"
bookings = Booking.objects.extra(select={'book_ref_digits': sql_query}).order_by('-book_ref_digits')
return bookings
据我所知,它增加了一个新的临时字段,例如: 在对象中,然后您可以对此执行该操作。book_ref_digitsQuerySet.order_by()
注意:使用旧版本的 Django 1.10.5
添加回答
举报
0/150
提交
取消