2017-03-04 27 views
0

使用Postgres作爲db和Django 1.9在Django ORM的替代nullif

我有一些模型與字段'價格'。 '價格'空白=真。 在ListView上,我得到查詢集。接下來,我想根據價格以價格= 0進行排序。

我怎樣才能在SQL寫: 'ORDER BY NULLIF(' 價格 '0)NULLS LAST'

如何把它寫在Django的ORM?或者在rawsql上?

回答

0

您仍然可以ORDER BY PRICE NULLS LAST如果在您選擇的價格選擇SELECT NULLIF('price', 0)。這樣你就可以得到你想要的訂單,但數據以你想要的方式返回。在Django ORM,你會選擇與annotateTableName.objects.annotate(price=NullIf('price', 0)和通過NULLS LAST訂單,該訂單由我會按照建議在這裏Django: Adding "NULLS LAST" to query

否則,你也可以ORDER BY NULLIF('price', 0) DESC但將重新排序其他數值的價格。如果你不需要它們,你也可以完全排除查詢中的空價格。

+0

如何進口NULLIF?從哪個模塊? – VoidArray

+0

對不起,來自https://github.com/aykut/django-aggregates – quetzaluz

0

好的。我找到了替代品。用django func寫自己的NullIf。

from django.db.models import Func 

class NullIf(Func): 
    template = 'NULLIF(%(expressions)s, 0)' 

,並使用它的查詢集:

queryset.annotate(new_price=NullIf('price')).order_by('new_price')