如何将 Api 视图 class 转换为 CreateModelMixin

How to Convert Api view class to CreateModelMixin

class Add_Product(APIView):
    def post(self,request,*args, **kwargs):
        user=request.user
        if user.is_authenticated:
            data=request.data
            date=datetime.now().date()
            slug=user.username+"-"f'{int(time())}'
            print(data)
            serializer=ProductSerializer(data=data,many=True)               
            if serializer.is_valid():
                print(serializer.data)
                serializer.save(user=request.user,slug=slug)
                return Response("Your product is added")
            return Response(serializer.errors)
        return Response("Login First")

我想将其转换为 CreateModelMixin 但我不知道如何在创建方法中传递 request.user 和 slug 等值。

class Product_List(GenericAPIView,CreateModelMixin):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    def post(self,request,*args, **kwargs):
        return self.create(request,*args,**kwargs)

您可以通过其上下文将用户传递给序列化程序,然后覆盖其 create 方法:

# View
class Product_List(GenericAPIView,CreateModelMixin):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = (IsAuthenticated,)

    def get_serializer_context(self):
        return {'user': self.request.user}

# Serializer
class ProductSerializer(serializers.ModelSerializer):
    [...]

    def create(self, validated_data):
        user = self.context['user']
        slug = f'{user.username}-{int(time())}'

        return Product.objects.create(
            user=user,
            slug=slug,
            **validated_data
        )