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

rkkpypqq  于 2022-11-19  发布在  Go
关注(0)|答案(3)|浏览(178)

我试图找到最好的解决方案来排序我的数据库中的所有机器对象,并找到最后使用的deviceSerialNo。
deviceSerialNo是一个字符字段,其结构如下:第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
有人能帮我按我上面提到的排序吗?

ldioqlga

ldioqlga1#

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

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"的整数转换是一个负数。

jm81lzqq

jm81lzqq2#

如果号码有多个-并且想从反向中提取号码,请尝试以下操作:AB-12-12344
产量:12344台

qs.annotate(
   r_part=Reverse('number')
).annotate(
   part=Reverse(
        Cast(
             Substr("r_part", 1, StrIndex("r_part", V("-")))
        ), 
        IntegerField()
    )


感谢

6ju8rftf

6ju8rftf3#

可以使用extra()函数对对象进行排序:

your_objects = Machine.objects.all()
your_objects = your_objects.extra(select={'str_deviceSerialNo':'SUBSTRING("deviceSerialNo",initial_char,last_char)'}).order_by('str_deviceSerialNo')

对我很有效。

相关问题