Home > Software engineering >  How to Convert Api view class to CreateModelMixin
How to Convert Api view class to CreateModelMixin

Time:01-27

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")

I want to convert this to CreateModelMixin But i don't know how to pass values like request.user and slug in create method.

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

CodePudding user response:

You can pass the user to the serializer through its context then override its create method:

# 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
        )

  •  Tags:  
  • Related