Python 1.4创建user/serializers.py写序列化器 from rest_ framework import serializers from user 。models import User def address_ validate( data): #独立校验器 # raise serializers . ValidationError('请填写实际地址') #有错就抛出异常 #没错就返回数据 return data #没错就返回数据 return data class UserSerializer(serializers . ModelSerializer): # 1.独立校验器: 重新设定字段,替换掉模型中的设定,重新设定地址的长度为5 address = serializers CharF ield(max_ 1ength=255,min_ 1ength=5, val idators= [address_ validate]) # 2.单一字段验证,验证地址 def validate_ address(self, data): if data =='测试': raise serializers . ValidationError( '请填写实际地址") # 有错就抛出异常 return data # 没错就返回结果 def validate. _phone(self, data): #不符合手机号格式 # raise serializers . ValidationError('手机号格式不正确') model = self . root. Meta . model num = model . objects . filter( phone=data) . count( ) """ from django.http import HttpResponse # http响应 from django_filters.rest_framework import DjangoFilterBackend # Django过滤器后端 from rest_framework import viewsets # 视图集 from rest_framework . authentication import BasicAuthentication,SessionAuthentication # 基本身份验证, 会话身份验证 from rest_framework.decorators import action from rest_framework.filters import OrderingFilter # 排序过滤器 from rest_framework. permissions import AllowAny,IsAdminUser,IsAuthenticated,IsAuthenticatedOrReadOnly #从权限导入允许所有、Admin用户、经过身份验证、经过身份验证或只读 from rest_framework.response import Response from rest_framework.throttling import UserRateThrottle # 用户速率节流 from rest_framework.pagination import PageNumberPagination # 页码分页 from rest_framework .views import APIView from rest_framework .permissions import BasePermission,SAFE_METHODS # 基础权限、SAFE_METHODS from user .models import UserModel from user.serializers import UserSerializer """ def index(request): # 需要认证才能访问的视图 return HttpResponse('hello') """分页布局:自定义分页器 布局""" class PageNum(PageNumberPagination): """查询字符串中代表每页返回数据数量的参数名,默认值: None""" page_size_query_param = 'page_size' # 查询字符串中代表页码的参数名,有默认值: page page_query_param = 'page' # 一页中最多的结果条数 max_page_size = 2 """自定义权限(局部)""" class MyPermission(BasePermission): def has_permission(self, request, view): print(view.kwargs.get("pk"), request.user.id) """判断用户对模型有没有访问权 任何用户对使用此权限类的视图都有访问权限""" print(request) if request.user.is_superuser: """管理员对用户模型有访问权""" return True elif view.kwargs.get('pk') == str(request.user.id): """携带的id和用户的id相同时有访问权""" return True return False def has_object_permission(self, request, view, obj): # 获取单个数据时,判断用户对某个数据对象是否有访问权限 if request.user.id == obj.id: return True return False class UserViewSet(viewsets.ModelViewSet): """完成产品的增删改查""" queryset = User.objects.all() serializer_class = UserSerializer # 优先使用get_serializer_class返回的序列化器? # #1.认证:自定义认证类,自定义会覆盖全局配置 # authentication_classes = (BasicAuthentication,SessionAuthentication) # #2.权限:自定义权限类 # permission_classes = (MyPermission,) # 3.分页:自定义分页器覆盖全局配置 pagination_class = PageNum # 4.限流:自定义限流类 throttle_classes = [UserRateThrottle] # 5.过滤:指定过滤方法类,排序方法类,一个或多个 filter_backends = (DjangoFilterBackend, OrderingFilter) # 5.1指定排序字段,不设置,排序功能不超效 ordering_fields = ('date_joined', 'id') # 5.2指定过滤字段,不设置,过滤功能不起效 filter_fields = ('username', 'phone', 'is_active') def get_serializer_class(self): if self.action == 'unactived': return UserUnActiveSerializer else: return UserSerializer @action(methods=['get'], detail=False) def unactived(self, request, *args, **kwargs): # 获取查询集,过滤出未激活的用户 qs = self.queryset.filter(is_active=False) # 使用序列化器,序列化查询集,并且序列化多条 ser = self.get_serializer(qs, many=True) return Response(ser.data)