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

时间:2019-03-08 12:07:44

标签: python django django-queryset

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

有人可以如上所述帮助我进行排序吗?

1 个答案:

答案 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"的整数强制转换为负数。