對於一個項目庫,用戶可以手動排序某些項目以始終使它們首先顯示。Django模型queryset使用.extra()或union來在PositiveIntegerField上應用自定義排序
對於該模型有一個「排序」不爲null PositiveIntegerField(默認爲0)。與排序字段項大於零,手動排序,並在0
之前排序值沒有排序項就必須出現可以使用可能是這樣的SQL查詢:
(select photo, sort, 0 as priority from photos where sort > 0)
union all
(select photo, sort, 1 as priority from photos where sort = 0)
order by priority, sort
結果將外觀像:
+---------+------+----------+
| photo | sort | priority |
+---------+------+----------+
| photo-a | 1 | 0 |
| photo-b | 2 | 0 |
| photo-c | 0 | 1 |
| photo-d | 0 | 1 |
| photo-e | 0 | 1 |
| ... |
但我不明白它應該如何正確使用Django Queryset完成?
我能夠合併兩個不同的查詢集與list(chain(q1, q2))
但執行查詢,這對大集合是低效的,特別是如果我的查詢集應該被傳遞給django.core.paginator,通常會應用LIMIT OFFSET子句分頁。當然,我可以在每個查詢q1
和q2
上應用切片,但由於它與分頁器的作用重疊,所以這有點難看。
也許我試圖做錯的方式。或者也許它應該用extra()方法完成?
你能詳細解釋爲什麼'Photo.objects.all()。order('sort')'不夠嗎? – scytale
我詳細說明了我的問題,這可能會回答爲什麼降序order_by on是不夠的。 – nrako