2010-02-01 30 views
17

Tôi có một bảng 'vé' với các cột sauCó thể Django ORM thực hiện ORDER BY trên một giá trị cụ thể của một cột không?

  • id - chính chủ chốt - tự động tăng
  • tiêu đề - varchar (256)
  • trạng thái - smallint (6) - Có thể có bất kỳ giá trị giữa 1 và 5, được xử lý bởi Django

Khi tôi sẽ thực hiện SELECT * Tôi muốn các hàng có status = 4 ở trên cùng, các bản ghi khác sẽ theo dõi chúng. Có thể đạt được điều này bằng truy vấn sau:

select * from tickets order by status=4 DESC 

Truy vấn này có thể được thực hiện thông qua Django ORM không? Thông số nào cần được chuyển đến phương thức QuerySet.order_by()?

+0

bạn không đặt hàng, bạn đang lọc (mệnh đề WHERE của SQL). – stefanw

+1

@stefanw - Nó sẽ được gọi là lọc nếu CHỈ muốn ghi với trạng thái = 4, mà tôi không. – rubayeet

Trả lời

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

cảm ơn! đã lưu cho tôi rất nhiều mã! – rubayeet

+0

Tôi upvoted này cho sự gọn gàng của nó, nhưng sau đó nhận thấy một lưu ý trong các tài liệu nói rằng .extra() dự kiến ​​sẽ không được chấp nhận. Điều này có thể được thực hiện theo cách khác, ví dụ: với chú thích? https://docs.djangoproject.com/en/1.10/ref/models/querysets/#extra – shacker

2

Tôi đã làm điều này trong khi sử dụng PostgresSql với django.

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

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

Nó sẽ trả về tất cả các đối tượng từ vé, nhưng vé có trạng thái = 4 sẽ ở đầu.

Hy vọng ai đó sẽ thấy nó hữu ích.

Các vấn đề liên quan