所以,在我的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
"类型"对象的属性可以是"限制","液体"或"条件"
如图所示,问题在于我打算如何对订单对象进行排序。我想这样做,以便按以下层次排序:
数值(价格,音量)可以通过方便的order_by函数轻松排序,但是当涉及到字符串属性时,我就停止了。它甚至不是按字母顺序排列的,所以我无法这样做。我看到一些选项只是烦人且效率低下的解决方法:
所以我的TLDR问题是,有没有办法按非字母顺序基于字符串值属性对对象进行排序?此外,我的对象是否会使用我当前的模型维护它的排序层次结构,或者我是否应该以不同的方式加入order_by语句(不确定是否按某个属性排序" unsort"新对象我刚刚创建了。)
注意:" _list"后缀只是为了清晰起见,我知道它不是一个清单:)
更新:我当前的实施工作是我的解决方案#1示例,但我想知道是否有其他方式对其进行排序。
答案 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)