zoukankan      html  css  js  c++  java
  • modelviewset views

    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)
      
    做最野的狼
  • 相关阅读:
    mysql基础操作
    网页粒子背景
    将Myeclipse项目改成Eclipse项目
    mybatis入门配置和调试
    《增删改查返回问题》
    AES加密与解密(秘钥)
    svn下载代码cleanup失败解决办法
    maven中net.sf.json报错
    idea提交SVN时忽略某些文件或文件夹
    《面试常问到的知识点》
  • 原文地址:https://www.cnblogs.com/shanjiaaa/p/13746401.html
Copyright © 2011-2022 走看看