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

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

Use Djoser In Api's For Authentication In Django