Python / Django 查询 - 将原始 SQL 附加到模型对象
我想在Django的模型对象中添加原始SQL查询。我想执行的SQL查询不想写得太复杂。原始SQL是:
SELECT * FROM elements ORDER BY IF(elements.order=0, 99999, elements.order) ASC
简单来说,就是根据“order”字段来排序,但如果它们的“order”值是'0',那么这些元素就排在最后。
我试过使用extra()或者在后面加raw(),但是效果都不太好……我想做的事情大概是这样的:
Elements.objects.all().extra("ORDER BY IF(order=0, 99999, order)") ## or
Elements.objects.all().raw("ORDER BY IF(order=0, 99999, order)")
有没有什么线索???
2 个回答
0
把你自定义的SQL语句放在extra
里的select
部分,然后用order_by
来根据这个新值进行排序:
Elements.objects.all().extra(
select={
'my_order_no': 'IF(elements.order=0, 99999, elements.order)'
},
order_by='my_order_no'
);
0
别那样做。
这样做。
results = list( Element.objects.filter(whatever).exclude( order__isnull=True ).order_by( order ) )
results.extend( Element.objects.filter(whatever).filter( order__isnull=False ) )
这样可以避免写出太复杂的SQL语句。
试试这个。它真的很快,可能比SQL还要快。
def by_order( item ):
return item.order if item.order is not None else 2**32
results = list( Element.objects.filter(whatever).all() )
results.sort( key=by_order )