2017-03-04 75 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')