Разница между патчами на /product/ и /product/{id} Django Rest Framework

Я пытаюсь сделать проект, который позволяет создавать и исправлять модель продукта.

Все работает нормально согласно всему моему коду, когда я помещаю запрос патча для этого объекта в /product/ Пробовал полезную нагрузку : { "id": 46, "name": "DBZ", "created": "2022-12-08T12:48:48.232455Z", "max_nodes": 22, "allowed": false } И я получаю ошибку поля валидации 422 с "detail": "Please enter only the whitelisted fields", что и ожидалось.

Но когда я помещаю запрос патча в /product/46 с полезной нагрузкой: { "name": "DBZ", "created": "2022-12-08T12:48:48.232455Z", "max_nodes": 22, "allowed": false } Я получаю сообщение 200 OK, и объект с этим id получает исправление.

Я новичок в этом DRF, может кто-нибудь дать мне знать, что здесь происходит.

models.py

class Product(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    name = models.CharField(max_length=256)
    max_nodes = models.IntegerField()
    allowed = models.BooleanField(default=False)
    auto_delete = models.BooleanField(default=False)
    
    def __str__(self):
        """
        The string to represent this object.
        We use the name field to provide a reasonable value
        in the Admin pages.
        """
        return self.name

serializers.py

class ProductSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Product
        fields = ('id', 'name', 'created', 'max_nodes', 'allowed', 'auto_delete')

views.py

class ProductViewSet(viewsets.ModelViewSet):
    """
    API Endpoint that allows patching product objects
    """
    queryset = Product.objects.all()
    serializer_class = ProductSerializer

    def create(self, request):
        if request.user.is_anonymous:
            logger.warning("ANONYMOUS USER!")
            raise PermissionDenied()
        serializer = ProductSerializer(data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data)
    
     def patch(self, request):
        if not request.user.is_superuser:
            logger.warning("Not a superuser")
            raise PermissionDenied()
        instance = Product.objects.get(id=request.data['id'])
        all_fields = ['id', 'name', 'created', 'max_nodes', 'allowed', 'auto_delete']
        whitelisted_fields = ['name', 'max_nodes', 'allowed', 'auto_delete']
        extra_fields = [key for key in list(request.data.keys()) if key not in whitelisted_fields and key != "id"]
        if len(extra_fields) > 0:
            return Response({"Please enter only the whitelisted fields"},
                                status=status.HTTP_422_UNPROCESSABLE_ENTITY)

        # Get all fields
        sanitized_data = {}
        for field in all_fields:
            if field in request.data:
                sanitized_data[field] = request.data[field]
            else:
                sanitized_data[field] = getattr(instance, field)

        serializer = ProductSerializer(instance=instance, data=sanitized_data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data)

urls.py

router.register(r'products', ProductViewSet, basename='product')

Может ли кто-нибудь помочь в этом?

Я пробовал патчить объекты обоими способами, на данный момент ничего продуктивного не найдено. Прошу помощи/инструкций здесь.

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