Django:管理员 - 基于正则表达式对结果进行排序

我有一个问题,我想在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

关于如何解决这个问题的任何建议?谢谢!


隔江千里
浏览 123回答 2
2回答

智慧大石

您可以使用 .extra() 方法从 rawqueryset 转换为查询集,请参阅此处此示例取自此处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])

慕侠2389804

正如@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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python