2010-02-01 61 views
17

我有一個表 '門票' 有以下的列Can Django ORM可以對列的特定值執行ORDER BY嗎?

  • ID - 主鍵 - 自動增加
  • 標題 - VARCHAR(256)
  • 狀態 - SMALLINT(6) - 可以有之間的任意值1和5,通過Django的

處理的時候,我會做一個SELECT *我想在頂部status = 4行,其他記錄將跟隨他們。它可以通過以下查詢來實現:

select * from tickets order by status=4 DESC 

該查詢是否可以通過Django ORM執行?應該將什麼參數傳遞給QuerySet.order_by()方法?

+0

您沒有訂購,您正在過濾(SQL WHERE子句)。 – stefanw 2010-02-01 11:49:29

+1

@stefanw - 如果只想要狀態= 4的記錄,我將它稱爲過濾。 – rubayeet 2010-02-01 11:52:35

回答

20
q = Ticket.objects.extra(select={'is_top': "status = 4"}) 
q = q.extra(order_by = ['-is_top']) 
+0

謝謝!爲我節省了很多代碼! – rubayeet 2010-02-01 12:19:35

+0

我對此表示讚賞,因爲它的整潔,但後來發現文檔中有一個說明.extra()計劃將被棄用。這可以通過另一種方式來完成,例如與註釋? https://docs.djangoproject.com/en/1.10/ref/models/querysets/#extra – shacker 2016-10-28 19:10:36

2

我在使用PostgresSql和Django時做了這個。

from django.db.models import Case, Count, When 

Ticket.objects.annotate(
    relevancy=Count(Case(When(status=4, then=1))) 
).order_by('-relevancy') 

它將返回Ticket中的所有對象,但狀態= 4的票將在開始處。

希望有人會發現它有用。

相關問題