Кривоватое решение. Достаточно передать несуществующий id прилетит 500.
Поэтому все первичные ключи нужно валидировать.
class RatingSerializer(serializers.Serializer):
user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
rating = serializers.IntegerField(min_value=1, max_value=5)
def create(self, validated_data):
user = validated_data['user']
rating = validated_data['rating']
profile = Profile.objects.get(user=user)
rating_obj = Rating.objects.create(profile=profile, rating=rating)
return rating_obj
А вьюха должна тогда выглядеть так:
class RatingAdd(generics.GenericAPIView):
serializer_class = serializers.RatingSerializer
permission_classes = [IsAuthenticated]
def post(self, request, **kwargs):
data = request.data.copy()
data.update({'user': kwargs['userid'}})
serializer = self.get_serializer(data=data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
(upd) Сорян, поправил вьюху, т.к. не удалил кусок оригинального кода.
Что до вопроса про
kwargs, то непонятно чего вы ждали, ведь это же
kwargs ViewSet'a а не сериализера. Тут нужно быть осторожным, но вообще их можно выковырять из контекста, так как
ApiView.get_serializer() еще пропихивает в сериализер контекст:
def create(self, validated_data):
view = self.context.get('view')
userid = view.kwargs['userid'] if view else None
if not userid:
raise NotFound('User with given id does not exist.')
rating = Rating.objects.create(profile=Profile.objects.get(user__id=userid), **validated_data)
return rating