DRF API возвращает список с отфильтрованными списками - PullRequest
0 голосов
/ 26 сентября 2019

Возвращаемые данные - это один список со всеми полями.Я хочу, чтобы данные были разделены в разных списках внутри основного списка.Например, список данных, отфильтрованных по дате до сегодняшнего дня, и список после сегодняшней даты.Я мог бы написать две конечные точки и отфильтровать данные в наборе запросов, но для этого потребовалось бы два отдельных вызова API.

Представление:

class StudyPageViewSet(viewsets.ModelViewSet):
    """
    Study create, read, update, delete over API.
    """
    model = Study
    serializer_class = StudyPageSerializer
    permission_classes = (IsAuthenticated, IsAuthorPermission,)

    def get_queryset(self):
        return Study.on_site.all()

Сериализатор:

class StudyPageSerializer(serializers.ModelSerializer):

    class Meta:
        model = Study
        fields = ('id', 'title', 'date', 'location')
        read_only_fields = ('id',)

Результат должен быть таким:

[ 
   { 
      "list_before_today":[ 
         { 
            "id":"5001",
            "title":"None"
         },
         { 
            "id":"5002",
            "title":"Glazed"
         },

      ]
   },
   { 
      "list_after_today":[ 
         { 
            "id":"5003",
            "title":"None"
         },
         { 
            "id":"5004",
            "title":"Glazed"
         },

      ]
   },

]

Токовый выход:

[
    {
        "id": 588,
        "title": "title",
        .. : ..
    },
    {
        "id": 590,
        "title": "title2",
        .. : ..
    },
]

пс.точки представляют другие поля.

1 Ответ

1 голос
/ 26 сентября 2019

По умолчанию, когда вы вызываете запрос GET в представлении ModelViewSet, он вызывает метод list.Внутри метода списка Rest Framework действительно использует Model для создания набора запросов для запроса данных, а затем передает его в Serializer для сериализации данных, а затем возвращает их, поэтому вы получили следующее:

[
    {
        "id": 588,
        "title": "title",
        .. : ..
    },
    {
        "id": 590,
        "title": "title2",
        .. : ..
    },
]

Таким образом, чтобы получить ответ, который вы ожидаете, вы должны переопределить этот list метод, чтобы получить ответ с форматом, который вы ожидаете, например так:

from datetime import date

from rest_framework import status

class StudyPageViewSet(viewsets.ModelViewSet):
    """
    Study create, read, update, delete over API.
    """
    model = Study
    serializer_class = StudyPageSerializer
    permission_classes = (IsAuthenticated, IsAuthorPermission,)

    def get_queryset(self):
        return Study.on_site.all()

    def list(self, request):
        queryset = self.get_queryset()
        today = date.today()

        output = [{
            "list_before_today": self.get_serializer(queryset.filter(date__lt=today), many=True).data
        }, {
            "list_after_today": self.get_serializer(queryset.filter(date__gt=today), many=True).data
        }]


        return Response(output, status=status.HTTP_200_OK)

Это просто идея, поэтому у вас естьчтобы соответствовать вашему коду, чтобы он работал.Я также не рекомендую вам делать это, потому что ModelViewSet четко определен Django Rest Framework, если вы хотите получить этот ответ, вы также можете создать другой APIView для обработки этого.

Надеюсь, что это поможет!

...