クエリセットの順序付けは、Django ではなく、データベース バックエンドによって処理されます。これにより、注文方法を変更するオプションが制限されます。すべてのデータをロードして Python で並べ替えるか、クエリに追加オプションを追加して、関数を定義することでデータベースに何らかのカスタム並べ替えを使用させることができます。
queryset extra()関数を使用すると、並べ替えのためにカスタム SQL を実行することで、必要なことを行うことができますが、移植性が低下します。
あなたの例では、入力フィールドを最初の文字と残りの整数値の 2 つのデータ セットに分割するだけで十分でしょう。次に、両方の列に並べ替えを適用できます。以下に例を示します (未テスト)。
qs = MyModel.objects.all()
# Add in a couple of extra SELECT columns, pulling apart this_field into
# this_field_a (the character portion) and this_field_b (the integer portion).
qs = qs.extra(select={
'this_field_a': "SUBSTR(this_field, 1)",
'this_field_b': "CAST(substr(this_field, 2) AS UNSIGNED)"})
このextra
呼び出しにより、2 つの新しいフィールドが呼び出しに追加されSELECT
ます。最初の句はフィールドの最初の文字を取り出し、2 番目の句はフィールドの残りを整数に変換します。
order_by
これらのフィールドでできるようになりました。に 2 つのフィールドを指定するとorder_by
、順序付けは最初に文字フィールドに適用され、次に整数フィールドに適用されます。
例えば
qs = qs.order_by('this_field_a', 'this_field_b')
この例は、MySql と SQLite の両方で機能するはずです。ソートにのみ使用される単一の追加フィールドを作成して、order_by()
呼び出しで単一のフィールドのみを指定できるようにすることもできます。