0

アイテムのギャラリーの場合、ユーザーはいくつかのアイテムを手動で並べ替えて、常に最初に表示されるようにすることができます。

そのため、モデルには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句が適用されます。もちろん、各クエリにスライスを適用することもできますq1q2、これは、ページネーターが行うことと重複するため、少し醜いです。

多分私はそれを間違った方法でやろうとしています。それとも、extra()メソッドを使用して実行する必要がありますか?

4

2 に答える 2

1

クエリセットのユニオン/マージを行うことは解決策ではありません。はるかに簡単な解決策は、order ステートメントで比較を使用することです。stackeoverflowに関する回答は、このきちんとした解決策を示してくれました。

select * from photos order by sort=0, sort

0=0 は 1 に等しい True として評価され、1=0 は 0 に等しい False などと評価されますか?

Django Queryset に翻訳:

Photos.objects.extra(select={'sortiszero': 'sort = 0'}, order_by=['sortiszero', 'sort'])

結果:

+---------+------+
| photo   | sort |
+---------+------+
| photo-a | 1    |
| photo-b | 2    |
| photo-c | 0    |
| photo-d | 0    |
| photo-e | 0    |
| ...            |

ほら!

于 2013-01-15T09:52:33.100 に答える
0

詳細を提供する必要があります。

この 2 つのセットを結合したい場合は、リストを追加するだけです。

list1 = SomeModel.objects.filter(sort != 0).order_by('column_name_1','column_name_2')
list2 = SomeModel.objects.filter(sort = 0).order_by('priority','foo')
return list = list1 + list2

または、extra() メソッドを使用する場合の例を次に示します。

list = SomeModel.objects.fooMethod().extra(order_by=[foo,])
于 2013-01-14T17:02:36.183 に答える