Отображение индекса каждого элемента отсортированного списка в представлении Django DRF

Я разрабатываю приложение с бэкендом Django и фреймворком DRF для моего api.

По заданному url я хотел бы отобразить индекс (ранг) каждого пользователя после сортировки списка в моем представлении. Я не могу объяснить это очень хорошо, поэтому я поместил два примера в конце моего сообщения.

Я не нашел в интернете ничего о том, как это сделать без изменения шаблона для добавления поля (я не могу использовать это решение).

У вас есть идея?

Спасибо!

Ниже мой взгляд :


class RankBestPurchaserViewset(viewsets.ViewSet):
    def list(self, request):
        queryset = User.objects.all()
        serializer = RankUserAllPurchaseSerializer(queryset, many=True)
        sortedList = sorted(serializer.data, key=itemgetter(
            'amount'), reverse=True)
        return Response(sortedList)


Ниже мой сериализатор :

class RankUserAllPurchaseSerializer(serializers.BaseSerializer):
    def to_representation(self, instance):
        return {
            'id': instance.id,
            'username': instance.username,
            'surname': instance.surname,
            'amount': float(SaleProduct.objects.filter(sale__sender__username=instance.username).aggregate(Sum('price'))['price__sum'] or 0),
            'qty_amount': SaleProduct.objects.filter(sale__sender__username=instance.username).count(),
        }

Ниже результат :


[
    {
        "id": 3,
        "username": "An20",
        "surname": "Khalvin",
        "amount": 426.7,
        "qty_amount": 110
    },
    {
        "id": 1,
        "username": "AA_ENS",
        "surname": "gum",
        "amount": 0.0,
        "qty_amount": 0
    },
    {
        "id": 4,
        "username": "in22",
        "surname": "gum",
        "amount": 0.0,
        "qty_amount": 0
    }
]



желаемый результат


[
    {
        "index":1,
        "id": 3,
        "username": "An20",
        "surname": "Khalvin",
        "amount": 426.7,
        "qty_amount": 110
    },
    {
        "index":2,
        "id": 1,
        "username": "AA_ENS",
        "surname": "gum",
        "amount": 0.0,
        "qty_amount": 0
    },
    {
        "index":3
        "id": 4,
        "username": "in22",
        "surname": "gum",
        "amount": 0.0,
        "qty_amount": 0
    }
]

or

[
    1:{
        "id": 3,
        "username": "An20",
        "surname": "Khalvin",
        "amount": 426.7,
        "qty_amount": 110
    },
    2:{
        "id": 1,
        "username": "AA_ENS",
        "surname": "gum",
        "amount": 0.0,
        "qty_amount": 0
    },
    3:{
        "id": 4,
        "username": "in22",
        "surname": "gum",
        "amount": 0.0,
        "qty_amount": 0
    }
]




Возможно, вы можете добавить код в представление.

class RankBestPurchaserViewset(viewsets.ViewSet):
    def list(self, request):
        ...
        sortedList = sorted(serializer.data, key=itemgetter(
            'amount'), reverse=True)
        # here I added the code to add the ranking index 
        for index, sortedItem in enumerate(sortedList):
            sortedList[index].update('index', index + 1)
        return Response(sortedList)

Спасибо @David Lu Вот ответ :



class RankBestPurchaserViewset(viewsets.ViewSet):
    def list(self, request):
        queryset = User.objects.all()
        serializer = RankUserAllPurchaseSerializer(queryset, many=True)
        sortedList = sorted(serializer.data, key=itemgetter(
            'amount'), reverse=True)
        for index, sortedItem in enumerate(sortedList):
            sortedList[index].update(index=index+1)
        return Response(sortedList)


Вернуться на верх