【问题标题】:Can Django ORM do an ORDER BY on a specific value of a column?Django ORM 可以对列的特定值执行 ORDER BY 吗?
【发布时间】:2011-01-11 16:36:12
【问题描述】:

我有一个包含以下列的表格“门票”

  • id - 主键 - 自动递增
  • 标题 - varchar(256)
  • 状态 - smallint(6) - 可以有 1 到 5 之间的任何值,由 Django 处理

当我执行SELECT * 时,我希望顶部带有status = 4 的行,其他记录将跟随它们。可以通过以下查询来实现:

select * from tickets order by status=4 DESC

这个查询可以通过 Django ORM 执行吗?应该将哪些参数传递给QuerySet.order_by() 方法?

【问题讨论】:

  • 你不是在排序,你是在过滤(SQL WHERE 子句)。
  • @stefanw - 如果只想要 status=4 的记录,这将被称为过滤,我不想要。

标签: python mysql django orm


【解决方案1】:

对于那些有需要的人,就像我一样,现在偶然发现并正在使用更新版本的 django

Ticket.objects.annotate(
            relevancy=Case(When(status=4, then=1), When(status=3, then=2), When(status=2, then=3), output_field=IntegerField())
        ).order_by('-relevancy')

使用 Count() 将返回 1 或 0,具体取决于您的案例是否被发现。如果按几个状态订购则不理想

【讨论】:

    【解决方案2】:

    我在 django 中使用 PostgresSql 时这样做了。

    from django.db.models import Case, Count, When
    
    Ticket.objects.annotate(
        relevancy=Count(Case(When(status=4, then=1)))
    ).order_by('-relevancy')
    

    它将返回 Ticket 中的所有对象,但 status = 4 的门票将在开头。

    希望有人会觉得它有用。

    【讨论】:

      【解决方案3】:
      q = Ticket.objects.extra(select={'is_top': "status = 4"})
      q = q.extra(order_by = ['-is_top'])
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 2011-10-13
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 2013-10-06
      • 2011-09-13
      相关资源
      最近更新 更多