我想在django rest框架中为User
模型实现以下URL设计(基于githubs的REST api):
# get authenticated user (the currently logged in user):
#
# GET user/
#
# update authenticated user:
#
# PATCH user/
#
# get single user (will only return instructors)
#
# GET user/:username
#
# get all users (will only return instructors)
#
# GET users/
给定User
模型,我有以下标准序列化器:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = models.MyUser
fields = '__all__'
我可以使用基于函数的视图为每个URL实现url路由,但是DRF提供了许多基于类的视图和路由器,我想知道是否有更简洁的方法来实现它?
答案 0 :(得分:0)
基本上,您可以创建一个视图子类generics.GenericAPIView,并为CURD添加mixins,如下面的代码:
url(r'^/user/(?P<pk>\d+)/detail/$', UserDetailView.as_view(), name='user_detail'),
url(r'^/user/(?P<pk>\d+)/update/$', UserDetailView.as_view(), name='user_update'),
url(r'^/user/list/$', UserListView.as_view(), name='user_list'),
from rest_framework import mixins
from rest_framework import generics
class UserListView(mixins.ListModelMixin,
generics.GenericAPIView):
queryset = MyUser.objects.all()
serializer_class = UserSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
class UserDetailView(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = MyUser.objects.all()
serializer_class = UserSerializer
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
如果您需要更多控制逻辑,您可以:
get_queryset
中的UserListView
,并提供逻辑以过滤用户并返回查询集。get_queryset
UserDetailView
partial_update
中的UserDetailView
以提供更新逻辑。总之,mixins是您开始在DRF上创建更通用的基于类的视图的好地方。
答案 1 :(得分:0)
我意识到这有点晚了,但以防其他人发现:
viewset.py:
class UserViewSet(RetrieveModelMixin, UpdateModelMixin, GenericViewSet):
queryset = None
serializer_class = serializers.UserSerializer
def get_object(self):
return self.request.user
这不是以上示例的完整示例,但是是一个很好的示例。这里的get_object
并不依赖于查询集,但是仍然可以提供没有pk
的对象。
urls.py:
urlpatterns = [
# GET: /user/ [Retrieve]
# PUT: /user/ [Update]
url(
r'^user/$',
UserViewSet.as_view({'get': 'retrieve', 'put': 'update'}),
name='user'
),
]
此处,路由以标准Django格式定义,而不是依靠drf
路由器来提供url(该URL自动包含pk
对象)。这样可以删除详细信息pk
(或添加可选的内容等)。