アイテムのギャラリーの場合、ユーザーはいくつかのアイテムを手動で並べ替えて、常に最初に表示されるようにすることができます。
そのため、モデルには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クエリセットを使用して適切に実行する方法がわかりませんか?
2つの異なるクエリセットをでマージすることはできlist(chain(q1, q2))
ますが、クエリが実行され、これは大きなコレクションでは非効率的です。特に、クエリセットをdjango.core.paginatorに渡す必要がある場合は、通常、ページネーションにLIMITOFFSET句が適用されます。もちろん、各クエリにスライスを適用することもできますq1
がq2
、これは、ページネーターが行うことと重複するため、少し醜いです。
多分私はそれを間違った方法でやろうとしています。それとも、extra()メソッドを使用して実行する必要がありますか?