1

readonly_fields をソート/順序付けするにはどうすればよいですか ( https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.readonly_fieldsを参照)?

これが私がすることです:

class MyUserAdmin(UserAdmin):
    readonly_fields = ('pinCount')
    list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'is_active', 'date_joined', 'last_login', 'pinCount')

    def pinCount(self, instance):
        return Pin.objects.filter(user=instance).count()

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)

admin では、リストを pinCount でソートできるはずです。これは直接のデータベース フィールドではないため、ドキュメントによるとそれは不可能です。それを行う方法はありますか?

ありがとう!

4

2 に答える 2

0

順序付けは、管理者ではなくDBによって行われます(これは、変更リストのデバッグツールバー出力です)。

ここに画像の説明を入力してください

そのため、カスタム管理メソッドを使用して注文することはできません。メソッドCountを上書きすることで、管理者のクエリセットに注釈を追加できます。 ModeAdmin.queryset

class MyModelAdmin(admin.ModelAdmin):

    ...

    def queryset(self, request):
        qs = super(MyModelAdmin, self).queryset(request)
        return qs \
            .annotate(pin_count=Count('pin')) \
            .order_by('-pin_count')

または、より詳細な制御が必要な場合は、管理者によって表示されたクエリセットを並べ替えることができますが、これはテストしていません。

class MyModel(models.Model):
    ...

    @property
    def pin_count(self):
        return self.pin.count()


import operator  
class MyModelAdmin(admin.ModelAdmin):

    ...

    def queryset(self, request):
        qs = super(MyModelAdmin, self).queryset(request)
        return sorted(qs, key=operator.attrgetter('pin_count'))
于 2012-11-24T13:57:14.203 に答える
0

私はこれを自分で行ったことはありませんが、解決策があるようです (問題のモデルのカスタム ModelManager を定義することを含むものと、管理インターフェイスの魔法に依存するもの): Django admin: カスタムの 1 つで並べ替える方法データベース フィールドを持たない list_display フィールド

あなたの場合の問題は、問題のモデルがユーザーモデルであることです。これはおそらく変更するのは良い考えではありません。あなたの場合、ここで説明されているように、カスタム UserProfile モデルを追加することをお勧めします: Django ユーザー プロファイル

この値で頻繁にクエリを実行する必要がある場合は、ユーザー プロファイル モデルで各ユーザーの pinCount 値を具体化することをお勧めします。要件によっては、データベース トリガーを使用して、この値を最新の状態に保つことができます。

于 2012-11-24T14:01:47.940 に答える