我希望有一个API,用户可以在其中更新自己的列表。目前,任何经过身份验证的用户都可以更新我使用Postman找到的任何列表。我想验证用户,以便API在用户不尝试更新自己的列表时返回错误作为响应。这是我的代码:
# serializers.py
class ListingSerializer(serializers.ModelSerializer):
class Meta:
model = Listing
fields = '__all__'
# api.py
class ListingViewSet(ModelViewSet):
permission_classes = [IsAuthenticatedOrReadOnly]
serializer_class = ListingSerializer
def get_queryset(self):
return Listing.objects.all()
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
# urls.py
router = routers.DefaultRouter()
router.register('api/listings', ListingViewSet, 'listings')
urlpatterns = router.urls
你只需要覆盖perform_update
函数:
def perform_update(self, serializer):
obj = self.get_object()
if self.request.user != obj.created_by: # Or how ever you validate
raise PermissionDenied('User is not allowed to modify listing')
serializer.save()
你会需要:
from django.core.exceptions import PermissionDenied
您可以限制所有方法的对象更改主查询集。在这种情况下,如果不成熟的用户试图访问无效对象,则api返回404。
def get_queryset(self):
return Listing.objects.filter(owner=self.request.user)