Как упорядочить буквенно-цифровые поля CharFields в Django

У меня есть модель для пунктов меню, которая имеет CharField для чисел, так как некоторые из них имеют подварианты, которые имеют буквенный суффикс

fx. 25, 26, 27, 27a, 28...

как упорядочить объекты после номера меню с учетом суффикса после?

так что этот список

[1g, 14, 2g, 27a, 27, 33, 33b]

было бы

[1g, 2g, 14, 27, 27a, 33, 33b]

когда просто используется order_by, то по умолчанию выбирается первое число, так что

[27, 4 0, 27a]

получается как

[0, (2)7, (2)7a, 4]

Хотя вы можете делать всевозможные строковые операции, приведения и т.д., это не то, для чего предназначены базы данных, и, скорее всего, это будет работать не очень эффективно, потому что тогда придется сначала загрузить все строки в память. Возможно, вариантом является работа с двумя полями, одним IntegerField и одним (возможно, пустым) CharField, например:

class MyModel(models.Model):
    item_0 = models.IntegerField()
    item_1 = models.CharField(max_length=1, blank=True)

    @property
    def item(self):
        return f'{self.item_0}{self.item_1}'

Здесь мы таким образом разделяем данные, поэтому для выборочных данных это:

data = [
    MyModel(item_0=1, item_1='g'),  # 1g
    MyModel(item_0=14, item_1=''),  # 14
    MyModel(item_0=2, item_1='g'),  # 2g
    MyModel(item_0=27, item_1='a'),  # 27a
    MyModel(item_0=27, item_1=''),  # 27
    MyModel(item_0=33, item_1=''),  # 33
    MyModel(item_0=33, item_1='b'),  # 33b
]

и затем мы можем легко заказать с:

MyModel.objects.order_by('item_0', 'item_1')

Как правило, столбцы следует рассматривать как атомарные единичные (плоские) элементы. Другими словами, в одном столбце не должно храниться две (или более) сущности данных, а значит, и не список.

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