码迷,mamicode.com
首页 > 其他好文 > 详细

序列化,视图,路由

时间:2020-10-06 20:51:55      阅读:29      评论:0      收藏:0      [点我收藏+]

标签:print   tor   imp   out   全局   include   rgs   set   过滤   

1 创建user/serializers.py 写序列化器

 

from rest_framework import serializers

from user.model import User

 

def address_validate(data):

  #独立校验器

  #raise serializers.ValidationError(‘请填写实际地址‘)  # 有错就出异常

  # 没错就返回数据

  return data

 

 

 

class UserSerializer(serializers.ModelSerializer):

  #独立校验器,重新设定字段,替换掉模型中的设定,重新设定地址的长度为5

  address=serializers.CharField(max_length=255,min_length5,validators=[ address_validate])

  #单一字段验证,验证地址

  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()

      if num > 0:

        raise serializers.ValidationError(‘手机号已存在‘)

      return data

 

    #3 所有属性验证器

  def validate(self,attrs):

    #attrs:{"username":"zhangsan","phone":"188888212"....}

    #所有属性验证器

    #self.context 中有request和view 上下文

    #self.context [‘View‘].action 可以取到动作

    #attrs 是需要序列化的数据

    #raise serializers.ValidationError(‘xxx错误‘)  #有问题报错

    return attrs

  class Meta:

    model=User

    #fields=(‘id‘, ) #临时添加字段也需要写这里

    fiedls=‘__all__‘

    read_only_fields=(‘ ‘, )

    extra_kwargs={

      "address" : {

        "min_lenggth" : 5, #给地址增加 最小长度限制

        “default” : " 默认测试地址",  #增加默认值

      }

 

 

 

 

2   user/views.py

from django.http import HttpResponse
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import views
from rest_framework.authentication import BasicAuthentication,SessionAuthentication
from rest_framework.filters import OrderingFilter
from rest_framework.decorators import action
from rest_framework.permissions import AllowAny,IsAdminUser,IsAuthenticatedOrReadOnly,IsAuthenticated
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
from user.models import User
from user.serializers import UserInfoSerializer

 

 

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):

    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_class= (BasicAuthentication,SessionAuthentication)

  ##2权限:自定义权限类

  #permission_class=(MyPermission,)

 

 

  #3 分页:自定义分页器 覆盖全局配置

  pagination_class=PageNum

 

 

  #4 限流,自定义限流类

  throttle_classes=[ UserRateThrottle]

 

 

  #5过滤,指定过滤方法类,排序方法类一个或多个

  filter_backends=(DjangoFilterBackend,OrderingFilter)  #同时支过滤和帕西

  #5.1 指定排序字段,不设置,排序功能不起效

  ordering_fields= (‘date_joined‘ ,‘id‘)      #?ordering= -id

  #5.2 指定过滤字段,不设置,过滤功能不起效

  filter_fields={ ‘username‘,‘phone‘,‘is_active‘}  #?username=tom&phone=&is_active=true

  

 

 

  #根据不同的请求,获得不同的序列化器

  def get_serializer_class(self):

    if self.action == ‘unactived‘:

      return UserUnActiveSerializer

    else:

      return UserSerializer

 

 

 

 

3  urse/urls.py

from django.urls import include,path

from user import view

from rest_framework.routers import SimpleRouter ,DefaultRouter

  

#自动生成路由器方法,必须使用视图集

#router = DefaultRouter ()

router.register(r‘user‘,view.UserViewSet)

urlpatterns = [

    path(‘index/‘, views.index),

    path(‘api-auth/‘,include(‘rest_framework.urls‘, namespace="rest_framework")  #认证地址

]

 

urlpatterns +=router.urls  #模块地址

 

序列化,视图,路由

标签:print   tor   imp   out   全局   include   rgs   set   过滤   

原文地址:https://www.cnblogs.com/xiaoxiamiaichiyu/p/13772987.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!