У меня есть следующий сериализатор:
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)