Сортировка размеров с двумя и более числами в Django

Я пытаюсь отсортировать предметы, размеры которых описываются двумя числами, как указано ниже

10 x 13

100 x 60

7 x 8

Размер сохраняется в виде строки. Я хочу, чтобы они были отсортированы следующим образом (сначала по первому измерению, затем по второму)

7 x 8

10 x 13

100 x 60

как этого можно достичь с помощью Django?

Вы можете использовать для этого сортировку из математической библиотеки python. Когда-то у меня была похожая проблема, вот что я использовал, и это сработало просто отлично.

import math
l = ['10x13', '100x60','7x8']
sorted(l, key=lambda dim: math.hypot(*map(int, dim.split('x'))))
# ['7x8', '10x13', '100x60']

Я бы посоветовал хранить их не как строку, а как два IntegerField, например, так:

class Item(models.Model):
    width = models.IntegerField()
    height = models.IntegerField()

    @property
    def size(self):
        return f'{self.width}x{self.height}'

    @size.setter
    def size(self, value):
        self.width, self.height = map(int, value.split('x'))

Тогда вы сможете легко сортировать, например, по Item.objects.order_by('width', 'height'). Таким образом, у нас есть свойство .size, которое может форматировать элемент по размеру, и даже с сеттером, который может "разобрать" значение и поместить ширину и высоту в соответствующие поля.

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