繁体   English   中英

Django: Admin - 基于正则表达式的排序结果

[英]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一个,所以我不能这样做。

有关如何解决此问题的任何建议? 谢谢!

您可以使用 .extra() 方法将原始查询集转换为查询集,请参见此处

这个例子取自, here

class CustomManager(manager.Manager):
    def get_queryset():
        qs = self.get_queryset()
        sql = "myapp_model_b.id IN (SELECT UNNEST(myapp_model_a.pk_values) FROM myapp_model_a WHERE myapp_model_a.id='%s')" % index_id
        return qs.extra(where=[sql])

正如@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM