【问题标题】:Alternative nullif in Django ORMDjango ORM 中的替代 nullif
【发布时间】:2017-07-24 21:46:32
【问题描述】:

使用 Postgres 作为数据库和 Django 1.9

我有一些带有“价格”字段的模型。 '价格'空白=真。 在 ListView 上,我得到了查询集。接下来,我想以 price=0 结尾的价格排序。

我如何用 SQL 编写它: 'ORDER BY NULLIF('price', 0) NULLS LAST'

在Django ORM上怎么写?还是在rawsql上?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    好的。我找到了替代方案。用 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')
    

    编辑:Django 2.2 及更高版本已经实现了开箱即用。等效代码将是

    from django.db.models.functions import NullIf
    from django.db.models import Value
    queryset.annotate(new_price=NullIf('price', Value(0)).order_by('new_price')
    

    【讨论】:

      【解决方案2】:

      如果在您的选择中选择价格为SELECT NULLIF('price', 0),您仍然可以ORDER BY PRICE NULLS LAST。这样你就可以得到你想要的排序,但是数据会以你想要的方式返回。在 django ORM 中,您可以选择annotate 的价格,例如TableName.objects.annotate(price=NullIf('price', 0),并选择NULLS LAST 的订单,我会按照Django: Adding "NULLS LAST" to query 此处的建议进行操作

      否则您也可以ORDER BY NULLIF('price', 0) DESC 但这会重新排序其他数值。如果您不需要它们,显然也可以从查询中完全排除空价格。

      【讨论】:

      • 如何导入NullIf?来自哪个模块?
      • @VoidArray from django.db.models.functions import NullIf
      猜你喜欢
      • 2020-11-06
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      • 2019-07-19
      • 2019-11-24
      相关资源
      最近更新 更多