Так, в моем Django.models У меня есть класс, как следующее:Джанго: объект Сортировать по строке атрибуты не по алфавиту
class Basicorderbook(models.Model):
ordernumber = models.ForeignKey('Idbook', db_column='OrderNumber', related_name='BasicOrder_IDNumber', primary_key=True) # Field name made lowercase.
username = models.ForeignKey('Userbook', db_column='Username', to_field='username', related_name='BasicOrder_Username') # Field name made lowercase.
price = models.FloatField(db_column='Price') # Field name made lowercase.
volume = models.FloatField(db_column='Volume') # Field name made lowercase.
type = models.CharField(db_column='Type', max_length=20) # Field name made lowercase.
...
def __unicode__(self):
return unicode(self.ordernumber.idnumber)
...
и тем, как следующий возвращать объект, содержащий несколько «Основных заказы «:
class BuyOrdersView(generic.ListView):
model = models.Basicorderbook
template_name = 'Blank.html'
context_object_name = 'buy_order_list'
def get_queryset(self):
"""
Returns the 5 most viable buy orders
"""
base_buy_order_list = models.Basicorderbook.objects.using('exchange').filter(
action = 'Buy',
#price > 520,
#active = 1
)
volume_buy_order_list = base_buy_order_list.order_by('-volume')
#This line here in question (I know this won't work, it's just an example)
type_buy_order_list = volume_buy_order_list.order_by('Limit' in 'type')
price_buy_orders = type_buy_order_list.order_by('-price')
buy_order_list = price_buy_orders[:15]
return buy_order_list
„Тип“атрибут объекта может быть либо„Limit“,„Liquid“, или„Условный“
как видно, проблема заключается в том, как я намерен упорядочить порядок объект. Я хочу сделать так, чтобы она заказана со следующей иерархией:
- Самой высокая цена первого
- Если цена такой же, есть заказы с «условным» типом, а затем «предел», а затем «жидкость "
- Если цена на порядок и тип одинаковы, есть заказы, отсортированные по объему
численные значения (цена, объем) легко сортируется с помощью удобной функции order_by, но когда дело доходит до строки атрибутов Я остановился. Это даже не алфавитный порядок, поэтому я не могу так поступать. Я вижу несколько вариантов, которые просто раздражает и неэффективные методы обхода:
- Используйте для петли, чтобы взять каждый объект и добавить в конец в виде списка на основе их строки атрибутов
- Создайте еще один атрибут, «TypePriority», который я присвойте числовое значение (1, 2, 3) в зависимости от его приоритета в отношении типа заказа
Таким образом, мой вопрос TLDR заключается в способе сортировки объектов, алфавитный порядок? Кроме того, будет ли мой объект поддерживать иерархию сортировки с моей текущей моделью или я должен присоединиться к операторам order_by по-другому (не уверен, что сортировка по определенному атрибуту будет «отменять» новый объект, который я только что создал).
Примечания: суффикс «_list» только для ясности, я знаю, что это не список :)
UPDATE: Моя текущая реализация, которая работает мой обходной путь # 1 пример, но мне интересно, если есть способ сортировать в противном случае.
Хорошо, поэтому сортировка возможна. Это 1 часть; Другой способ сортировки «типа». Значения «жидкость», «предел» и «условное» являются строками внутри объекта «порядок», который находится в объекте «..._ list».Я не уверен, есть ли функция для такого метода переупорядочения, или мне нужно выяснить более абстрактный подход. Синтаксис/пример и ссылка на относительную документацию (если применимо) были бы A + –