6

リスト表示にカスタム callable があります。ソートできるようにしたいのですが、単一のフィールドに対応していないため、単独では使用できませんadmin_order_field

フィールドとして選択されている場合、これを反映するようにクエリセットの順序を変更できるようにしたいと思います。ただし、モデル管理者の呼び出しを介して実行したChangeListにビューが呼び出され、指定された並べ替えられたフィールドをループするように見えます ( a、b、c などはすべて、表示内の 1 つ以上のフィールドに対応する整数です)。リスト。get_ordering get_orderinga.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ことは解決策ではありません。

他にできることはないか、それとも顧客名だけを並べ替えフィールドとして使用することをあきらめて、別の組織、姓、および名の列に置き換える必要があるかどうか疑問に思っています。

4

1 に答える 1

0

admin_order_field は SQL 結果セットのフィールドであることに注意してください。そのため、管理者で get_queryset をオーバーライドして、並べ替えに適した「フィールド」を作成する必要があります。

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_queryset

おそらく Q() および F() 関数も必要になるでしょう。それらがpyodbcで機能するかどうかはわかりません。

さて、この「顧客」フィールドは、実際には並べ替えのためだけのものであるべきです。obj.customer からアクセスできます。

次に、そのフィールドでソートする関数 (「顧客」とも呼ばれます) が必要です。その中で、COALESCE でやりたかったロジックを実行します。

于 2014-02-28T18:10:34.253 に答える