我建议您使用drf-viewsets
链接。我们将使用vacation viewset
来完成这项工作。
我们的urls.py
from your_app.views import VacationViewSet
router.register('api/vacations/', VacationViewSet)
我们的 serializers.py
from rest_framework import serializers
from your_app.models import Vacation
class VacationSerializer(serializers.ModelSerializer):
class Meta:
model = Vacation
fields = ('id', 'owner',)
read_only_fields = ('id',)
我们的views.py
在这里,我们将重写viewset
的检索和列表方法。还有其他可能的方法可以做到这一点,但我最喜欢这种方法,因为我可以看到代码中正在发生什么。Django模型视图集继承了drf-mixins
的检索和列表方法link。
from rest_framework import viewsets, permissions, exceptions, status
from your_app.models import Vacation, User
from your_app.serializers import VacationSerializer
class VacationViewSet(viewsets.ModelViewSet):
queryset = Vacation.objects.all()
permission_classes = [IsAuthenticated]
serializer = VacationSerializer
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
queryset = queryset.filter(owner=self.request.user)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
if instance.owner is not self.request.user:
raise exceptions.PermissionDenied()
serializer = self.get_serializer(instance)
return Response(serializer.data)
IsOwner
类。 - Maram Sreerama Reddy