DRF: Incorrect type. Expected pk value, received str - ManyToManyField in Django APIs

How to fix if Incorrect type. Expected pk value, received strManyToManyField in Django Rest Framework


1. models.py


class Cart(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    events = models.ManyToManyField(Event, null=True, blank=True)
    resourse_files = models.ManyToManyField(ResourseDetail, null=True, blank=True)
    status = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

2. serializers.py



class CartSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Cart
        fields = '__all__'
or

class CartSerializer(serializers.ModelSerializer):
    events = EventSerializer(many=True)
    resourse_files = ResourseDetailSerializer(many=True)
    class Meta:
        model = Cart
        fields = '__all__'

3. views.py


class CartView(viewsets.ModelViewSet):
    '''Cart api view /cart/'''
    
    serializer_class = CartSerializer
    permission_classes = [IsAuthenticated]
      
    def get_queryset(self):
        user = self.request.user
        return Cart.objects.filter(user=user)

    def create(self, *args, **kwargs):
        current_user = self.request.user
        cart = Cart(user=current_user)
        cart.save()
        try:
            events = self.request.data['events']
            events = events[1:-1].split(",")
            event_ids = []
            [event_ids.append(int(i)) for i in events]
            cart.events.set(event_ids)
        except: 
            pass
        
        try:
            resourse_files = self.request.data['resourse_files']
            resourse_files = resourse_files[1:-1].split(",")
            resourse_file_ids = []
            [resourse_file_ids.append(int(i)) for i in resourse_files]
            cart.resourse_files.set(resourse_file_ids)
        except:
            pass
        cart.save()
        serializer = CartSerializer(cart)
        return Response(serializer.data)

    
    def update(self, request, *args, **kwargs):
        current_user = request.user.id
        cart = Cart.objects.filter(user=current_user).first()
        try:
            events = self.request.data['events']
            events = events[1:-1].split(",")
            event_ids = []
            try:
                [event_ids.append(int(i)) for i in events]
            except:
                pass
            if not event_ids:
                cart.events.clear()
            else:
                cart.events.set(event_ids)
        except: 
            pass
        
        try:
            resourse_files = self.request.data['resourse_files']
            resourse_files = resourse_files[1:-1].split(",")
            resourse_file_ids = []
            try:
                [resourse_file_ids.append(int(i)) for i in resourse_files]
            except:
                pass
            if not resourse_file_ids:
                cart.resourse_files.clear()
            else:
                cart.resourse_files.set(resourse_file_ids)
        except:
            pass
        
        cart.save()
        serializer = CartSerializer(cart)
        return Response(serializer.data)

no need to custmise destroy and get detail methods

If any issue found please comment


Comments

Popular posts from this blog

Use Djoser In Api's For Authentication In Django

AttributeError: Got AttributeError when attempting to get a value for field `field_name` on serializer `ModelSerializer`.