リスト表示にカスタム callable があります。ソートできるようにしたいのですが、単一のフィールドに対応していないため、単独では使用できませんadmin_order_field
。
フィールドとして選択されている場合、これを反映するようにクエリセットの順序を変更できるようにしたいと思います。ただし、モデル管理者の呼び出しを介して実行した後ChangeList
にビューが呼び出され、指定された並べ替えられたフィールドをループするように見えます ( a、b、c などはすべて、表示内の 1 つ以上のフィールドに対応する整数です)。リスト。get_ordering
get_ordering
a.b.c.etc.y.z
この例では、顧客が会社/組織または個人になることができる注文ページがあります。人によるすべての注文が最初にリストされ、次に組織が続き、すべてアルファベット順になるようにソートできるようにしたいと考えています。
例として、このモデルの管理設定を使用してみましょう。
class OrderAdmin(models.ModelAdmin):
list_display = ('pk', 'date_ordered', 'customer')
def customer(self, obj):
return obj.organization or "%s %s" % (obj.first_name, obj.last_name)
現時点では、callable にadmin_order_field
アタッチされている場合にのみソート フィールドが使用可能になるため、ソートできません。
def customer(self, obj):
return obj.organization or "%s %s" % (obj.first_name, obj.last_name)
customer.admin_order_field = 'customer'
問題は、理想的には、デフォルト コードをインターセプトして、「フィールドの 1 つが「顧客」の場合は、そのフィールドをリストから削除し、代わりに["organization", "last_name", "first_name"]
". しかし、私が知る限り、これを行う方法はありません。
これはSQL Serverデータベースであるため、使用していることを除いextra(select={'customer':...})
て、うまくいくと思います.生成されたSQLは単に機能せず、エラーをスローします:django-pyodbc
SELECT *
FROM (SELECT
( COALESCE(organization, firstname + ' ' + lastname) ) AS [customer],
...,
( Row_number()
OVER (
ORDER BY [customer] ASC, [orders].[date_created] DESC,
[orders].[order_id] ASC
) ) AS
[rn]
FROM [orders]) AS X
WHERE X.rn BETWEEN 1 AND 100
エラーは次のとおりです。
列名「顧客」が無効です。
django-pyodbc を書き直す以外に、使用する.extra
ことは解決策ではありません。
他にできることはないか、それとも顧客名だけを並べ替えフィールドとして使用することをあきらめて、別の組織、姓、および名の列に置き換える必要があるかどうか疑問に思っています。