我正在尝试寻找最佳解决方案来对数据库中的所有Machine对象进行排序,并找到最后使用的deviceSerialNo。
deviceSerialNo是一个字符字段,其结构如下:AB12-12344。
我的任务是按deviceSerialNo字段的子字符串对所有Machine对象进行排序(deviceSerialNo中'-'之后的所有内容)。 我目前的解决方案是可行的
last = Machine.objects.all().order_by('-deviceSerialNo').first().deviceSerialNo
或
last2 = Machine.objects.all().order_by('-deviceSerialNo').annotate(search_index=StrIndex('deviceSerialNo', V('-'))).first().deviceSerialNo
有人可以如上所述帮助我进行排序吗?
答案 0 :(得分:3)
您可以通过使用注释创建的字段进行排序:
from django.db.models import IntegerField
from django.db.models.functions import Cast, 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"
的整数强制转换为负数。