- 在视图集中创建额外的动作,动作名可以自己根据需求来定义
- 创建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
# 通过创建时间来查询用户信息def createTiem(self, request):starttime = datetime.date(2020, 11, 11)endtime = datetime.date(2020, 11, 13)user = UserProfile.objects.filter(date_joined__range=[starttime, endtime])serializer = self.get_serializer(instance=user, many=True)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”) ]
- 使用partial=True来设定更新部分时只传入部分数据即可,不必传入全部数据```pythonimport datetimefrom rest_framework.viewsets import ModelViewSetfrom rest_framework.response import Responsefrom .serializers import UserProfileSerializersfrom .models import UserProfileclass UserExtraActionViewSet(ModelViewSet):''' 视图集额外的动作 '''queryset = UserProfile.objects.all()serializer_class = UserProfileSerializerslookup_url_kwarg = 'id'# 更新用户名字def update_username(self, request, id):user = self.get_object()data = request.dataserializer = self.get_serializer(instance=user, data=data, partial=True) ### partial=True在序列化器对象中设置serializer.is_valid(raise_exception=True)serializer.save()return Response(serializer.data, status=status.HTTP_201_CREATED)######### urls.pyfrom django.urls import pathfrom . import viewsurlpatterns = [path('extra/<int:id>', views.UserExtraActionViewSet.as_view({'get': 'update_username'}), name="extra")]
