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

我试图找到最佳解决方案来对我的数据库中的所有 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

有人可以按照我上面提到的方式帮我排序吗?


蛊毒传说
浏览 138回答 2
2回答

慕婉清6462132

您可以按使用 annotate 创建的字段进行排序:from django.db.models import IntegerField, Value as Vfrom django.db.models.functions import Cast, StrIndex, Substrlast = (    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"是负数。

阿波罗的战车

如果数字有多个 - 并且想要从反向中提取数字,请尝试以下操作。AB-12-12344输出:12344qs.annotate(   r_part=Reverse('number')).annotate(   part=Reverse(        Cast(             Substr("r_part", 1, StrIndex("r_part", V("-")))        ),         IntegerField()    ))谢谢
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python