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

Python Django:按字符串属性非字母顺序排序对象,python,django,object,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.Fore

因此,在我的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
对象的type属性可以是Limit、Liquid或Conditional

如图所示,问题在于我打算如何对order对象进行排序。我想使其按以下层次结构排序:

最高价优先 如果价格相同,则先有条件类型的订单,然后是限制类型的订单,然后是流动类型的订单 如果订单的价格和类型相同,请按数量对订单进行排序 数字值Price,Volume很容易通过便利的order_by函数进行排序,但是当涉及到字符串属性时,我就停下来了。这甚至不是字母顺序,所以我不能那样做。我看到了一些令人讨厌且效率低下的解决方案:

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

注:列表后缀仅为清晰起见,我知道它不是列表:


更新:我当前有效的实现是我的解决方案1示例,但我想知道是否有其他方法对其进行排序。

根据您的文本“有条件的”

“限制”

“液体”,因此对此进行排序应该是可行的。 你能不能做一个三向排序,比如“-price”,“type”,“volume”? 当然,这假设排序不区分大小写,或者输入在某个点被修改


D.

我忘了更新,但结果是没有办法按照我的要求对对象重新排序。最后,我按照价格、数量等进行了其他重组,但不得不创建一个新列表,检查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)

好的,所以排序是可能的。这是第一部分;另一个问题是如何对类型部分进行排序。liquid、limit和conditional值是order对象中的字符串,该对象位于…\u列表对象中。我不确定是否有用于这种重新排序方法的函数,或者是否需要找出一种更抽象的方法。语法/示例和相关文档的链接(如果适用)将是+