Разница между патчами на /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')
Может ли кто-нибудь помочь в этом?
Я пробовал патчить объекты обоими способами, на данный момент ничего продуктивного не найдено. Прошу помощи/инструкций здесь.