zoukankan      html  css  js  c++  java
  • modelviewset views

    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)
  • 相关阅读:
    找出数组中最长的连续数字序列(JavaScript实现)
    从数组中选出和等于固定值的n个数(JavaScript实现)
    比较任意两个JSON串是否相等(比较对象是否相等)JAVA版
    freshcodecolor纯正则实现的在线代码着色(高亮)
    最新QQ强制聊天代码,同时可判断好友关系
    (转)spring异常抛出触发事务回滚策略
    (转)Java回收对象的标记 和 对象的二次标记过程
    (转)调用System.gc没有立即执行的解决方法
    java线程池与五种常用线程池策略使用与解析
    (转)Spring事务管理详解
  • 原文地址:https://www.cnblogs.com/gaodenghan/p/13746845.html
Copyright © 2011-2022 走看看