Как собрать сумму всех данных в работе django restframe и отфильтровать по дате - PullRequest
0 голосов
/ 24 сентября 2019

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

Фактический API выглядит следующим образом

 {
        "count": 4,
        "next": null,
        "previous": null,
        "results": [
            {
                "pk": 1,
                "bikeid": "425432",
                "milage": 12,
                "movingtime": "5hr 12min",
                "averagespeed": 14,
                "kgtrasported": 234,
                "co2": 180,
                "additionalbox": 4,
                "nouser": 8,
                "too": "2019-09-23",
                "fromm": "2019-09-23"
            },
            {
                "pk": 2,
                "bikeid": "425433",
                "milage": 11,
                "movingtime": "5hr 12min",
                "averagespeed": 13,
                "kgtrasported": 134,
                "co2": 170,
                "additionalbox": 7,
                "nouser": 4,
                "too": "2019-09-23",
                "fromm": "2019-09-23"
            },

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

{
    "count": 4,
    "next": null,
    "previous": null,
    "total_milage":23,
    "total_co2":350,
    "total_additionbox":4,
    "total_user":12
    "results": [
        {
            "pk": 1,
            "bikeid": "425432",
            "milage": 12,
            "movingtime": "5hr 12min",
            "averagespeed": 14,
            "kgtrasported": 234,
            "co2": 180,
            "additionalbox": 4,
            "nouser": 8,
            "too": "2019-09-23",
            "fromm": "2019-09-23"
        },
        {
            "pk": 2,
            "bikeid": "425433",
            "milage": 11,
            "movingtime": "5hr 12min",
            "averagespeed": 13,
            "kgtrasported": 134,
            "co2": 170,
            "additionalbox": 7,
            "nouser": 4,
            "too": "2019-09-23",
            "fromm": "2019-09-23"
        },

Здесь Views.py

# Electric Bike Add 
class Ebike(generics.ListCreateAPIView):
    queryset = ElectricBike.objects.all()
    serializer_class = ElectricSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = {
        'too': ['lte','gte'],
        'fromm':['lte','gte'],
    }

здесь serializers.py

class ElectricSerializer(serializers.ModelSerializer):
    class Meta:
        model = ElectricBike
        fields = ('pk','bikeid','milage','movingtime','averagespeed','kgtrasported','co2','additionalbox','nouser','too','fromm')

вот скриншот данных

1 Ответ

0 голосов
/ 24 сентября 2019

Хорошо, для этого вам нужно написать пользовательский класс пагинации.

from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
from .models import ElectricBike

class CustomPagination(PageNumberPagination):
    def get_paginated_response(self, data):
        return Response({
                'next': self.get_next_link(),
                'previous': self.get_previous_link(),
                'count': self.page.paginator.count,
                'results': data,
                "total_milage": ElectricBike.objects.annotate(mileage=Sum('mileage')).values_list('mileage', flat=True),
                "total_co2"://your logic here,
                "total_additionbox"://your logic here,
                "total_user"://your logic here

            })

, а затем, на ваш взгляд, просто упомянуть ваш пользовательский класс пагинации

class Ebike(generics.ListCreateAPIView):
    queryset = ElectricBike.objects.all()
    pagination_class = CustomePagination
    serializer_class = ElectricSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = {
        'too': ['lte','gte'],
        'fromm':['lte','gte'],
    }
...