Сортировка размеров с двумя и более числами в 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
, которое может форматировать элемент по размеру, и даже с сеттером, который может "разобрать" значение и поместить ширину и высоту в соответствующие поля.