Как создать сериализатор с пользовательскими логами c? - PullRequest
0 голосов
/ 15 января 2020

Только два параметра поступают на вход:

  1. param1 = Int, опционально
  2. param2 = Char, требуется

На выходе - json с 4 элементами

  1. key1 = Char
  2. key2 = Int
  3. key3 = Int
  4. key4 = Int

Все может быть нулевым

Теперь я реализовал его в представлении в get method, но я хочу создать для этого Serializer и положить все логи c туда, но я не очень понимаю, куда передать логи c - validate, to_representation?

Теперь это выглядит примерно так

views.py

class ExampleRetrieveApiView(APIView):
    def get(self, request, *args, **kwargs):
        # A lot of logic related with input parameters.
        return Response({
            'key1': value1,
            'key2': value2,
            'key3': value3,
            'key4': value4
        })

Нужно сделать что-то подобное

views.py

class ExampleRetrieveApiView(APIView):
    serializer_class = ExampleSerializer

    def get(self, request):
        serializer = ExampleSerializer(???)
        return Response(serializer.data)

serializers.py

class ExampleSerializer(serializers.Serializer):
    ???

Ответы [ 2 ]

1 голос
/ 15 января 2020

Передайте входные параметры как dict. Затем вы должны использовать SerializerMethodField () для этого:

from rest_framework import serializers

class ExampleSerializer(serializers.Serializer):
  key1 = serializers.SerializerMethodField()
  key2 = serializers.SerializerMethodField()
  key3 = serializers.SerializerMethodField()
  key4 = serializers.SerializerMethodField()

  def get_key1(self, obj):
    # do some calculations, let's say we want to return input1 multiplied by 2
    # I'm accessing obj data and if it's empty assigning 0, you can add your own check instead
    return obj.get('input1', 0)*2

  def get_key2(self, obj):
    # same deal, do whatever calculations you want with the input data
    return obj.get('input2')

  def get_key3(self, obj):
    # your logic
    return

  def get_key4(self, obj):
    return

Для каждого поля, объявленного как SerializerMethodField, у вас должен быть соответствующий метод get_field.

Вам решать, как получить ввод params, вы можете сделать это с помощью параметров запроса или данных тела. Вызовите сериализатор, как это на ваш взгляд, например, с параметрами тела:

class ExampleRetrieveApiView (APIView):

def get(self, request):
    input_data = {'input1':request.data.get('input1'),
                  'input2':request.data.get('input2')}
    serializer = ExampleSerializer(input_data)
    return Response(serializer.data)
0 голосов
/ 15 января 2020

просмотров

class ExampleAPIView(APIView):
    serializer_class = ExampleSerializer

    def get(self, request):
        serializer = ExampleSerializer(data=request.query_params)
        if serializer.is_valid(raise_exception=True):
            return(Response(serializer.data))

сериализаторов

class ExampleSerializer(serializers.Serializer):
    param1 = serializers.IntegerField()
    param2 = serializers.CharField()

    def validate(self, data):
        #custom logic
        data['param3'] = 'text'
        #another params
        return data

    def to_representation(self, data):
        return {
            'key1': data['param3']
            'key2': data['param4']
            #another key for representation
        }
...