Как запросить SerializerMethodField в представлении списка API? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть PhysicalServerListSerializer, в нем есть поле метода сериализатора server_status.

class PhysicalServerListSerializer(ModelSerializer):

    server_status = serializers.SerializerMethodField()
    class Meta:
        model = PhysicalServer
        fields = "__all__"
        depth = 1

    def get_server_status(self, obj):

        if obj.task and obj.is_finish_task:
            return 'ok'

        if obj.task and not obj.is_finish_task:
            return 'ing'

Но у меня есть требование, когда я запрашиваю его в методе get.

http://localhost:8000/api/physicalserver/list/?server_status=ing

он не может запросить server_status, как решить эту проблему?


Мой код ListAPIView ниже:

class PhysicalServerListAPIView(ListAPIView):
    serializer_class = PhysicalServerListSerializer
    permission_classes = [AllowAny]
    pagination_class = CommonPagination

    def get_queryset(self):
        query_params = self.request.query_params
        filters = {'{}__contains'.format(key): value
                   for key, value in query_params.items()
                   }
        qs = PhysicalServer.objects.filter(**filters)
        return qs

1 Ответ

0 голосов
/ 24 мая 2018

Поскольку server_status не является полем модели, вы не можете фильтровать по его значению напрямую.Но вместо этого вы можете обновить ваш запрос следующим образом:

def get_queryset(self):
    query_params = self.request.query_params
    filters = {'{}__contains'.format(key): value
               for key, value in query_params.items()
               }
    server_status = query_params.get('server_status')
    if server_status: 
         if server_status == 'ok':
             filters.update({'task__isnull': False, 'is_finish_task': True})        
         if server_status == 'ing':
             filters.update({'task__isnull': False, 'is_finish_task': False})        
    qs = PhysicalServer.objects.filter(**filters)
    return qs

Также я предлагаю вам использовать django-filter.Этот инструмент позволяет реализовать фильтрацию намного проще.Однако обратите внимание, что даже с django-filter вы не сможете реализовать фильтрацию по server_status без настройки FilterSet's.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...