Как я могу сортировать по вычисляемым полям в 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