2014-09-25 2 views
0

Так, в моем 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“, или„Условный“

как видно, проблема заключается в том, как я намерен упорядочить порядок объект. Я хочу сделать так, чтобы она заказана со следующей иерархией:

  1. Самой высокая цена первого
  2. Если цена такой же, есть заказы с «условным» типом, а затем «предел», а затем «жидкость "
  3. Если цена на порядок и тип одинаковы, есть заказы, отсортированные по объему

численные значения (цена, объем) легко сортируется с помощью удобной функции order_by, но когда дело доходит до строки атрибутов Я остановился. Это даже не алфавитный порядок, поэтому я не могу так поступать. Я вижу несколько вариантов, которые просто раздражает и неэффективные методы обхода:

  1. Используйте для петли, чтобы взять каждый объект и добавить в конец в виде списка на основе их строки атрибутов
  2. Создайте еще один атрибут, «TypePriority», который я присвойте числовое значение (1, 2, 3) в зависимости от его приоритета в отношении типа заказа

Таким образом, мой вопрос TLDR заключается в способе сортировки объектов, алфавитный порядок? Кроме того, будет ли мой объект поддерживать иерархию сортировки с моей текущей моделью или я должен присоединиться к операторам order_by по-другому (не уверен, что сортировка по определенному атрибуту будет «отменять» новый объект, который я только что создал).

Примечания: суффикс «_list» только для ясности, я знаю, что это не список :)

UPDATE: Моя текущая реализация, которая работает мой обходной путь # 1 пример, но мне интересно, если есть способ сортировать в противном случае.

ответ

0

Я забыл обновить, но оказывается, что нет никакого способа, чтобы изменить порядок объекта как я и хотел. Я закончил делать другие реорганизации (по цене, объему и т. Д.), Но должен был создать новый список и проверить атрибут «type» и отсортировать его как таковой. Это выглядело так:

type_buy_order_list = [] 
for order in volume_buy_order_list: 
    if order[3] == "limit": 
     type_buy_order_list.append(order) 
    if order[3] == "liquid": 
     type_buy_order_list.append(order) 
    if order[3] == "conditional": 
     type_buy_order_list.append(order) 
0

На ваш текст «условный» < «предел» < «жидкий», поэтому сортировка по нему должна работать. Можете ли вы просто сделать трехстороннюю сортировку, такую ​​как ('-price', 'type', 'volume')?
Off Конечно, это предполагает, что сорт не чувствителен к регистру или вход изменяется в какой-то момент

D.

+0

Хорошо, поэтому сортировка возможна. Это 1 часть; Другой способ сортировки «типа». Значения «жидкость», «предел» и «условное» являются строками внутри объекта «порядок», который находится в объекте «..._ list».Я не уверен, есть ли функция для такого метода переупорядочения, или мне нужно выяснить более абстрактный подход. Синтаксис/пример и ссылка на относительную документацию (если применимо) были бы A + –

Смежные вопросы