Как получить Substr при аннотировании Django

Я пытаюсь отсортировать по порядковому номеру, у меня много видов

Ввод:

ADC123
ADC14
ADC23
ERD324
ERD12

Сортировка по умолчанию просто сортировка по алфавиту

Ожидаемые результаты (Сортировать только по номеру):

ERD12
ADC14
ADC23
ADC123
ERD324

Пример кода:

Person.objects.annotate(
    order_only_number=AddField(Substr("order_number", 1))
).order_by("order_only_number")

Как сказано в комментарии, вы должны Cast ваше поле в целое число, также вам нужно исправить метод Substr, потому что индекс начинается с 1, а ваши числа начинаются с индекса 4.

Ваш запрос должен выглядеть следующим образом:

from django.db.models import IntegerField
from django.db.models.functions import Cast, Substr

Person.objects.annotate(
    order_only_number= Cast(Substr("order_number", 4), IntegerField())
).order_by("order_only_number")

Пожалуйста, не делайте этого. Если номер вашего заказа содержит буквенную и цифровую части, вы можете использовать два поля, например:

class Person(models.Model):
    order_alpha_part = models.CharField()
    order_number_part = models.IntegerField()
    
    @property
    def order_number(self):
        return f'{self.order_alpha_part}{order_number_part}'

то вы можете использовать .order_by('order_number_part'). Свойство позволяет получить доступ к .order_number, который будет конкатенировать буквенную часть с числовой частью.

Вернуться на верх