2011-02-09 37 views
1

我想將原始sql添加到Django模型對象。 SQL中的查詢我想在不寫整個事情的情況下執行。原始的SQL是:Python/Django查詢 - 將原始SQL添加到模型對象

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

基本上由訂單場,但如果他們的訂單金額爲「0」順序元素,這些排在最後。

我一直在使用額外的()或追加原料()沒有任何巨大的成功嘗試。我希望能夠做這樣的事情:

Elements.objects.all().extra("ORDER BY IF(order=0, 99999, order)") ## or 
Elements.objects.all().raw("ORDER BY IF(order=0, 99999, order)") 

任何線索???

回答

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) 
+0

感謝。我喜歡答案和建議!儘管回答最初的問題,但是我可以做什麼? – GregL83 2011-02-09 23:14:15

0

放入extraselect自定義SQL,然後用order_by由新價值訂購:

Elements.objects.all().extra(
    select={ 
     'my_order_no': 'IF(elements.order=0, 99999, elements.order)' 
    }, 
    order_by='my_order_no' 
); 

extra docs