DRF: Incorrect type. Expected pk value, received str - ManyToManyField in Django APIs
How to fix if Incorrect type. Expected pk value, received str - ManyToManyField 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
Post a Comment