• 在视图集中创建额外的动作,动作名可以自己根据需求来定义
  • 创建url路由,路由中需要使用关系映射,在as_view()中定义,把自定义的动作名映射进来,例如:{ ‘get’, ‘createTime’ },其中createTime就是自定义的动作方法,key依旧是已经定义好的get、post、put、delete等 ```python import datetime from rest_framework.viewsets import ModelViewSet from rest_framework.response import Response from .serializers import UserProfileSerializers from .models import UserProfile

class UserExtraActionViewSet(ModelViewSet): ‘’’ 视图集额外的动作 ‘’’ queryset = UserProfile.objects.all() serializer_class = UserProfileSerializers

  1. # 通过创建时间来查询用户信息
  2. def createTiem(self, request):
  3. starttime = datetime.date(2020, 11, 11)
  4. endtime = datetime.date(2020, 11, 13)
  5. user = UserProfile.objects.filter(
  6. date_joined__range=[starttime, endtime])
  7. serializer = self.get_serializer(instance=user, many=True)
  8. return Response(serializer.data)
### urls.py

from django.urls import path from . import views

urlpatterns = [ path(‘extra’, views.UserExtraActionViewSet.as_view( {‘get’: ‘createTiem’}), name=”extra”) ]

  1. - 使用partial=True来设定更新部分时只传入部分数据即可,不必传入全部数据
  2. ```python
  3. import datetime
  4. from rest_framework.viewsets import ModelViewSet
  5. from rest_framework.response import Response
  6. from .serializers import UserProfileSerializers
  7. from .models import UserProfile
  8. class UserExtraActionViewSet(ModelViewSet):
  9. ''' 视图集额外的动作 '''
  10. queryset = UserProfile.objects.all()
  11. serializer_class = UserProfileSerializers
  12. lookup_url_kwarg = 'id'
  13. # 更新用户名字
  14. def update_username(self, request, id):
  15. user = self.get_object()
  16. data = request.data
  17. serializer = self.get_serializer(
  18. instance=user, data=data, partial=True) ### partial=True在序列化器对象中设置
  19. serializer.is_valid(raise_exception=True)
  20. serializer.save()
  21. return Response(serializer.data, status=status.HTTP_201_CREATED)
  22. ######### urls.py
  23. from django.urls import path
  24. from . import views
  25. urlpatterns = [
  26. path('extra/<int:id>', views.UserExtraActionViewSet.as_view(
  27. {'get': 'update_username'}), name="extra")
  28. ]