Django rest framework лучший способ проверить параметры запроса POST - PullRequest
0 голосов
/ 25 февраля 2019

Когда я получаю запрос POST для класса отдыха Django APIView, я хотел бы отфильтровать / проверить параметры, которые передаются, чтобы предотвратить их изменение.Например, для этого сериализатора:

class MediaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Media
        fields = ('id', 'title', 'content', 'url', 'createdByUser', 'karma', 'type', 'issue', 'creationDate', 'updatedDate')

Некоторые параметры, такие как id, creationDate или createdByUser, изменять не следует.Так что для моего класса class MediaDetail(APIView) у меня есть:


def validateRequest(self):
        user = self.request.data.get('createdByUser', None)
        karma = self.request.data.get('karma', None)
        creationDate = self.request.data.get('creationDate', None)

        if user is not None or karma is not None or creationDate is not None:
            return Response(status=status.HTTP_400_BAD_REQUEST)
@method_decorator(login_required)
def post(self, request, pk, format=None):
        self.validateRequest()
        media = self.get_object(pk)
        self._throwIfNotMediaAuthor(media, request.user)

        serializer = MediaSerializer(media, data=request.data)

        if serializer.is_valid():
            # serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Есть ли лучший способ сделать эту проверку?Может на сериализаторе?Я не нашел достаточно документации

1 Ответ

0 голосов
/ 25 февраля 2019

Да, вы можете использовать параметр read_only_fields на вашем сериализаторе Meta.

Пример использования внутри текущего представления (немного изменил его, если вы хотите создать объект, когда POST соответствует рекомендациям REST ):

class MediaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Media
        read_only_fields = ('id', 'karma', 'createdByUser', 'creationDate')
        ...

@method_decorator(login_required)
def post(self, request, pk, format=None):
        serializer = MediaSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save(createdByUser=request.user, creationDate=timezone.now().date(), karma=initial_value)
        return Response(serializer.data, status=status.HTTP_201_CREATED)
...