Сортировать объекты по подстроке модельного поля в Django - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь найти лучшее решение, чтобы перебрать все объекты Machine в моей базе данных и найти последнее устройство, которое не использовалось.

deviceSerialNo является символьным полем и имеет такую ​​структуру: AB12-12344.

Моя задача - отсортировать все объекты Machine по подстроке поля deviceSerialNo (все, что после '-' в 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 Ответ

3 голосов
/ 08 марта 2019

Вы можете заказать по полю, созданному с аннотацией:

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" является отрицательным числом.

...