Ошибка проверки Django REST Framework Serializer - PullRequest
0 голосов
/ 01 июня 2018

У меня есть следующий сериализатор:

class SearchSerializer(serializers.Serializer):
    category_id = serializers.IntegerField()
    search_term = serializers.CharField(required=False)

Мне нужно проверить, существует ли категория с идентификатором в базе данных, и получить ее значение в представлении.Чтобы избежать выборки Category дважды, я добавил следующий validate() в сериализатор.

def validate(self, data):
     try:
         category = Category.objects.get(pk=data['category_id'])
     except Category.DoesNotExist:
         raise serializers.ValidationError('Invalid category_id')
     self.data['category'] = category
     return data

Но это приводит к ошибке.

When a serializer is passed a `data` keyword argument you must call `.is_valid()` before attempting to access the serialized `.data` representation.
You should either call `.is_valid()` first, or access `.initial_data` instead.

Есть ли способ сделать это?

views.py

class SearchView(generics.GenericAPIView):
    def get(self, request):
        serializer = SearchSerializer(data=request.query_params)
        if serializer.is_valid():
            category_id = serializer.data['category_id']
            category = Category.objects.get(pk=category_id) ## Avoid this check
            # TODO: application logic
            return Response({'success': True})
        return Response(serializer.errors)

1 Ответ

0 голосов
/ 01 июня 2018

Вместо self.data['category'] = category вам нужно просто использовать data['category'] = category в вашем validate методе

Однако вы должны рассмотреть возможность использования PrimaryKeyRelatedField, например, так:

category = serializers.PrimaryKeyRelatedField(
    queryset=Category.objects.all(),
    error_messages={'does_not_exist': 'Invalid category id'})

и вам вообще не понадобится validate, и вы сможете получить доступ ко всему объекту Category в вашем виде непосредственно как serializer.validated_data['category']

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