[英]Django: Admin - order results based on regular expression
我有一个问题,我想根据字符串中的数字对 Django admin 中的模型行进行排序并忽略字母 - 如 XX0345XX、X0346XXX、XXX0347XX。 我想我应该为此使用正则表达式。 我有一个返回我想要的 SQL 查询 (PostgreSQL):
select * from mytable order by substring(my_field, '\d+')::int DESC
但是我无法在 Django admin get_queryset()
应用它来获得相同的结果。 我试过做这样的事情:
def get_queryset():
return Model.objects.raw("select * from mytable order by substring(my_field, '\d+')::int DESC")
但问题是我没有以这种方式返回正确的类型。 Model.objects.raw('...')
返回RawQuerySet
,但get_queryset()
应该返回QuerySet
实例而不是RawQuerySet
一个,所以我不能这样做。
有关如何解决此问题的任何建议? 谢谢!
正如@Azy_Crw4282 所指出的,您可以使用QuerySet.extra()
来运行原始 SQL 查询,并且仍然将结果作为QuerySet
实例返回。
这是我如何根据字符串中的数字对管理视图中的对象执行基于正则表达式的“ORDER BY”。 即根据它们包含的数字对 XX0345XX、X0346XXX、XXX0347XX 等字段进行排序 - 基本上得到一个与'\\d+'
正则表达式匹配的子字符串。
只需覆盖admin.ModelAdmin
类中的get_queryset()
函数。
解决方案:
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
据我了解,它在QuerySet
对象中添加了一个新的临时字段,例如book_ref_digits
,然后您可以在其上执行.order_by()
。
注意:使用旧版本的 Django 1.10.5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.