Как я могу получить доступ к полевым данным сериализатора до проверки его типа? - PullRequest
4 голосов
/ 23 апреля 2020

Как получить доступ к значению поля перед сериализацией в моем сериализаторе (serializers.Serializer) или в режиме покоя (UpdateAPIView)?

У меня есть что-то вроде этого:

class MySerializer(serializers.Serializer):
    my_field = serializers.IntegerField()

Если Я пытаюсь заполнить свое поле строкой 'test', оно немедленно вызовет ошибку ValidationError, сообщающую мне о неправильном типе данных (конечно, ожидая целое число). До появления этой ошибки я хочу зафиксировать значение и что-то с ним сделать, но понятия не имею, как и где я могу получить к нему доступ. У него везде пустое строковое значение. Я пытался получить его в is_valid() перед вызовом super() или с помощью raise_exception=False, но все еще не вижу его:

 '_kwargs': {'context': {'format': None,
                         'request': <rest_framework.request.Request object>,
                         'view': <rest.views.MyUpdateAPIView object>},
             'data': <QueryDict: {'my_field': ['']}>,
'initial_data': <QueryDict: {'my_field': ['']}>,

Когда я пытаюсь найти его в своем представлении, я также вижу ничего:

serializer.initial_data
<QueryDict: {'my_field': ['']}>

request.data
<QueryDict: {'my_field': ['']}>

Когда я пытаюсь проверить методы validate() или validate_my_field(), я даже не могу попасть туда из-за ошибки ValidationError, о которой я упоминал выше.

Как на самом деле выполняется проверка сериализатора работает? Каков порядок в нем и как я могу получить доступ к данным до их «очистки»?

Ответы [ 4 ]

0 голосов
/ 23 апреля 2020

Вы пробовали расширить обработчик ошибок? взгляните на это:

https://www.django-rest-framework.org/api-guide/exceptions/

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

0 голосов
/ 23 апреля 2020

Вы можете использовать метод .to_internal_value() для получения данных.

https://www.django-rest-framework.org/api-guide/serializers/#overriding -сериализация-десериализация-поведение

Пример кода:

def to_representation(self, instance):
    ret = super().to_representation(instance)
    print(ret['my_field'])
    return ret
0 голосов
/ 23 апреля 2020

Вы можете переопределить метод de init сериализатора и изменить объект данных de.

    def __init__(self, instance=None, data=empty, **kwargs):
        self.instance = instance
        if data is not empty:
            self.initial_data = data
        self.partial = kwargs.pop('partial', False)
        self._context = kwargs.pop('context', {})
        kwargs.pop('many', None)
        super(BaseSerializer, self).__init__(**kwargs)
0 голосов
/ 23 апреля 2020

если вы хотите получить доступ к данным, вам нужно получить их из запроса. К данным, отправленным на сервер API, можно получить доступ в объекте request.

Пример на ваш взгляд

class MyFieldView(APIView):

     def create(self, request, *args, **kwargs):
         test_string = request.data['test'] # the name of the item sent to the api
         serializer = self.get_serializer(data=request.data)
         ....

, поэтому вам нужно request.data

...