2014-09-25 31 views
0

所以,在我Django.models我有一个类,如下所示:Django的:通过串排序对象的属性不按字母顺序

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. 如果价格是一样的,有“条件”类型,然后再“限制”,然后在“液体订单“
  3. 如果订单的价格和类型是相同的,具有体积分类

的数值(价格,成交量)是由得心应手ORDER_BY功能轻松排序的订单,但是当涉及到字符串属性我已经停下来了。这不是一个字母顺序,所以我不能这样做。我看到,只是恼人的和低效的变通几个选项:

  1. 使用一个for循环来根据自己的串采取每个对象,并追加到一个列表属性
  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

根据您的文本'有条件'<'限制'<'液''所以排序应该工作。 你可以只做一个三路排序,如(''价格','类型','音量')?
当然,这个假设的排序是不区分大小写或输入在某些时候被修改

D.

+0

好的,所以排序是可能的。这是1部分;另一个是我如何分类“类型”部分。 “liquid”,“limit”和“conditional”值是“order”对象内的字符串,它位于“..._list”对象内。我不确定是否有这样的重新排序方法的函数,或者我是否需要找出更抽象的方法。语法/示例并链接到相关文档(如果适用)将是A + – 2014-09-25 03:02:43