Как я могу сортировать по вычисляемым полям в Django Admin?

У меня есть вычисляемый метод в моей модели, и на странице администратора я хочу добавить функцию сортировки для этого вычисляемого поля.

На данный момент я использую агрегацию для вычисляемых полей модели и отображаю это в админке. Как я могу добавить функцию сортировки для этого поля на странице администратора?

class CoinWallet(Account):
    student = models.OneToOneField(
        'students.Student',
        on_delete=models.PROTECT,
        related_name="coinWallet",
        null=True)

    @admin.display(description='Total Coins')
    def total_coins(self):

        positive_movements_aggregate = self.movement_set.filter(
            side=self.positive_side,
        ).aggregate(models.Sum('amount'))

        positive_movements_balance = positive_movements_aggregate[
            'amount__sum'] if positive_movements_aggregate['amount__sum'] else 0

        return f'{positive_movements_balance}'

@admin.register(CoinWallet)
class CoinWalletAdmin(admin.ModelAdmin):
    list_display = ('id', 'student', 'balance', 'total_coins', 'answer_coins', 'bonus_coins', )
    search_fields = ('id', 'student')

    def get_queryset(self, request):
        queryset = super(CoinWalletAdmin, self).get_queryset(request)
        queryset = queryset.annotate(_total_coins=ExpressionWrapper(F('balance'), output_field=DecimalField())).order_by('_total_coins')
        return queryset
    def total_coins(self, obj):
        return obj._total_coins
    total_coins.admin_order_field = '_total_coins'

Я попробовал это, но вместо баланса я хочу добавить сортировку для total_coins. Что я должен сделать в этом классе администратора?

вместо этого используйте order_by:

class CoinWalletAdmin(admin.ModelAdmin):
    ...
    def get_queryset(self, request):
        qs = super(CoinWalletAdmin, self).get_queryset(request)
        qs = qs.order_by(F('total_coins')
        return qs
Вернуться на верх