亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

按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 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號