在views.py中,.post()、.create()和perform_create()有什么区别?在serializers.py中的.create()又是什么意思?

9
我对.post().create()perform_create()views.py中以及在serializers.py中的.create()感到困惑。
似乎serializers.py中的.create()获取了validated_data,因此无法检查serializer.is_valid
以下是serializers.py的内容:
class PostListSerializer(ModelSerializer):
    class Meta:
        model = Post
        fields = [
            'title',
            'content',
            'publish',
        ]

    def create(self, validated_data):
        print("-------------------")
        print("5555555 - create", validated_data)
        return Post.objects.create(**validated_data)

如果我的代码是:

views.py

class TestPostListAPIView(ListCreateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostListSerializer

    def post(self, request, *args, **kwargs):
        serializer = PostListSerializer(data=request.data)
        if not serializer.is_valid(raise_exception=False):
            # deal with serializer.errors
            return Response({'[post]custome error 1 !!!!!!!!!'}, status=status.HTTP_400_BAD_REQUEST)
        else:
            print("[post]- serializer.validated_data ", serializer.validated_data)
            serializer.save()
        return Response({'[post]Create success'}, status=status.HTTP_201_CREATED)

这个流程将在views.py中使用.post(),然后传递到serializers.py中的.create(),最终通过Response返回给客户端。

如果我的views.py使用:

class TestPostListAPIView(ListCreateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostListSerializer

    # def post(self, request, *args, **kwargs):
    #     serializer = PostListSerializer(data=request.data)
    #     if not serializer.is_valid(raise_exception=False):
    #         # deal with serializer.errors
    #         return Response({'[post]custome error 1 !!!!!!!!!'}, status=status.HTTP_400_BAD_REQUEST)
    #     else:
    #         print("[post]- serializer.validated_data ", serializer.validated_data)
    #         serializer.save()
    #     return Response({'[post]Create success'}, status=status.HTTP_201_CREATED)

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        print("44444-1 perform_create ", serializer)
        if not serializer.is_valid(raise_exception=False):
            print("44444-3 serializer.is_valid() ", serializer.is_valid())
            return Response({'custome error!!!!!!!!!'}, status=status.HTTP_400_BAD_REQUEST)
        else:
            print("44444-7 serializer.validated_data ", serializer.validated_data)
        self.perform_create(serializer)
        return Response({ 'Create success'}, status=status.HTTP_201_CREATED)

    def perform_create(self, serializer):
        print("1111-1 perform_create ", serializer)
        if not serializer.is_valid(raise_exception=False):
            print("1111-3 serializer.is_valid() ", serializer.is_valid())
            return Response({'custome error!!!!!!!!!'}, status=status.HTTP_400_BAD_REQUEST)
        else:
            print("1111-7 serializer.validated_data ", serializer.validated_data)
        user = User.objects.filter(id=8)
        serializer.save(user=user.first())
        print("1111-8 perform_create ")

这个过程是在views.py中使用.create()-->.perform_create()-->.create()serializers.py中-->向客户端发送Response

两种方式都可以工作!
我发现如果我发布无效数据,即使我注释了.create()部分,该过程也不会进入.perform_create()部分,因此似乎.perform_create()不能检查serializer.is_valid(),也不能检查该方法。

那么,在views.py中,.post().create()有什么区别?我应该只使用.post()还是应该使用.create()加上.perform_create()
我想知道,因为我必须使用自定义响应消息,例如{'custom error!!!!!!!!!'},但我对其影响感到困惑,我应该把逻辑放在哪里。

1个回答

2

从关于perform_create钩子和其他的文档中:

这些钩子特别适用于设置在请求中隐含的属性,但不是请求数据的一部分。例如,您可以基于请求用户或基于URL关键字参数在对象上设置属性。

最初的回答:

perform_create钩子和其他钩子非常有用,可以设置在请求中隐含的属性,但这些属性不是请求数据的一部分。例如,您可以根据请求用户或URL关键字参数在对象上设置属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接