为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

隔江千里 2022-08-16 10:29:54
我有一个问题,我想在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个赞

您可以使用 .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])


查看完整回答
反对 回复 2022-08-16
?
慕侠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


查看完整回答
反对 回复 2022-08-16
  • 2 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信