Как получить 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, который будет конкатенировать буквенную часть с числовой частью.