Как преобразовать класс представления Api в 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 в метод create.

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']
        date = datetime.now().date()
        slug = f'{user.username}-{int(time())}'

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

Вернуться на верх