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

按django中模型字段的子字符串对对象进行排序

按django中模型字段的子字符串对对象进行排序

蛊毒传说 2021-11-30 15:46:23
我试图找到最佳解决方案来对我的数据库中的所有 Machine 对象进行排序并找到最后使用的 deviceSerialNo。deviceSerialNo 是一个字符字段,具有如下结构:AB12-12344。我的任务是通过 deviceSerialNo 字段的子字符串(deviceSerialNo 中“-”之后的所有内容)对所有 Machine 对象进行排序。我目前的解决方案是这样的last = Machine.objects.all().order_by('-deviceSerialNo').first().deviceSerialNo或者last2 = Machine.objects.all().order_by('-deviceSerialNo').annotate(search_index=StrIndex('deviceSerialNo', V('-'))).first().deviceSerialNo有人可以按照我上面提到的方式帮我排序吗?
查看完整描述

2 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

您可以按使用 annotate 创建的字段进行排序:


from django.db.models import IntegerField, Value as V

from django.db.models.functions import Cast, StrIndex, Substr


last = (

    Machine.objects.annotate(

        part=Cast(Substr("deviceSerialNo", StrIndex("deviceSerialNo", V("-"))), IntegerField())

    )

    .order_by("part")

    .first()

    .deviceSerialNo

)

就像你让我们从获取-字符的索引开始:


StrIndex('deviceSerialNo', V('-'))

然后我们利用Substr得到包括-字符的第二部分:


Substr("deviceSerialNo", StrIndex("deviceSerialNo", V("-")))

然后我们将它转换为一个 IntegerField,排序并得到第一个对象。注意:我们可以得到第一个对象,因为 的整数转换"-12344"是负数。


查看完整回答
反对 回复 2021-11-30
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

如果数字有多个 - 并且想要从反向中提取数字,请尝试以下操作。AB-12-12344


输出:12344


qs.annotate(

   r_part=Reverse('number')

).annotate(

   part=Reverse(

        Cast(

             Substr("r_part", 1, StrIndex("r_part", V("-")))

        ), 

        IntegerField()

    )

)


谢谢


查看完整回答
反对 回复 2021-11-30
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

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