Django:按字母顺序按字符串属性排序对象

时间:2014-09-25 02:15:02

标签: python django object

所以,在我的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

"类型"对象的属性可以是"限制","液体"或"条件"

如图所示,问题在于我打算如何对订单对象进行排序。我想这样做,以便按以下层次排序:

  1. 最高价格
  2. 如果价格相同,请订购"有条件的"首先键入,然后键入"限制"然后" liquid"
  3. 如果订单的价格和类型相同,请按订单排序
  4. 数值(价格,音量)可以通过方便的order_by函数轻松排序,但是当涉及到字符串属性时,我就停止了。它甚至不是按字母顺序排列的,所以我无法这样做。我看到一些选项只是烦人且效率低下的解决方法:

    1. 使用for循环获取每个对象并根据其字符串属性
    2. 追加到列表中
    3. 创建另一个属性" TypePriority",我根据订单类型的优先级分配数值(1,2,3)
    4. 所以我的TLDR问题是,有没有办法按非字母顺序基于字符串值属性对对象进行排序?此外,我的对象是否会使用我当前的模型维护它的排序层次结构,或者我是否应该以不同的方式加入order_by语句(不确定是否按某个属性排序" unsort"新对象我刚刚创建了。)

      注意:" _list"后缀只是为了清晰起见,我知道它不是一个清单:)

      更新:我当前的实施工作是我的解决方案#1示例,但我想知道是否有其他方式对其进行排序。

2 个答案:

答案 0 :(得分:0)

根据您的文字'有条件的' < '限制' < '液体'所以对此进行排序应该有效。 你可以做一个三向排序,例如(' -price',' type',' volume')? 当然,这假设排序不区分大小写或输入在某个时刻被修改

d

答案 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)