Python / Django查询 - 将原始SQL附加到模型对象

时间:2011-02-09 21:30:20

标签: python django django-models

我想将原始sql添加到Django模型对象中。 SQL中的查询我想在不编写整个内容的情况下执行。原始SQL是:

SELECT * FROM elements ORDER BY IF(elements.order=0, 99999, elements.order) ASC

基本上,按订单字段订购元素,但如果订单值为'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 :(得分:1)

不要那样做。

这样做。

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 )

答案 1 :(得分:0)

将自定义SQL放在select的{​​{1}}中,然后使用extra按新值排序:

order_by

extra docs