ModelViewSet里的过滤、排序、分页、序列化设置

1.DRF初始化

1.认证

2.权限

3.限流

4.序列化

5.分页

6.版本 

7.过滤

8.排序

1.1安装DjangoRestFramework

pip install djangoresframework==3.11.1

pip install django-filter==2.3.0   #过滤器

pip install markdown     #Markdown support for the browsable API

1.2在syl/settings.py中注册

INSTALLED_APPS=[

  'django_filters',

  'rest_fromework'

]

# 过滤器

# 1,安装 django-filter

# 2,注册应用

# 3,配置settings, 在view里配置可过滤的字段

# 4,使用 查询字符串携带过滤信息

 

REST_FRAMEWORK = {

    #3.限流(防爬虫)

    'DEFAULT_THROTTLE_CLASSES': [

        'rest_framework.throttling.AnonRateThrottle',

        'rest_framework.throttling.UserRateThrottle',

    ],

    #3.1限流策略

    'DEFAULT_THROTTLE_RATES': {

        'user': '100/hour',    # 认证用户每小时100次

        'anon': '3/day',       # 未认证用户每天能访问3次

    },

 

    'DEFAULT_CONTENT_NEGOTIATION_CLASS': 'rest_framework.negotiation.DefaultContentNegotiation',

    'DEFAULT_METADATA_CLASS': 'rest_framework.metadata.SimpleMetadata',

    'DEFAULT_VERSIONING_CLASS': None,

 

    #4.分页(全局):全局分页器, 例如 省市区的数据自定义分页器, 不需要分页

    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',

    # 每页返回数量

    'PAGE_SIZE': 10,  # 默认 None

 

    #5.过滤器后端

    'DEFAULT_FILTER_BACKENDS': [

        'django_filters.rest_framework.DjangoFilterBackend',

        # 'django_filters.rest_framework.backends.DjangoFilterBackend', 包路径有变化

    ],

 

    #5.1过滤排序(全局):Filtering 过滤排序

    'SEARCH_PARAM': 'search',

    'ORDERING_PARAM': 'ordering',

 

    'NUM_PROXIES': None,

 

    #6.版本控制:Versioning  接口版本控制

    'DEFAULT_VERSION': None,

    'ALLOWED_VERSIONS': None,

    'VERSION_PARAM': 'version',

 

    # Authentication  认证

    # 未认证用户使用的用户类型

    'UNAUTHENTICATED_USER': 'django.contrib.auth.models.AnonymousUser',

    # 未认证用户使用的Token值

    'UNAUTHENTICATED_TOKEN': None,

 

    # View configuration

    'VIEW_NAME_FUNCTION': 'rest_framework.views.get_view_name',

    'VIEW_DESCRIPTION_FUNCTION': 'rest_framework.views.get_view_description',

 

    'NON_FIELD_ERRORS_KEY': 'non_field_errors',

 

    # Testing

    'TEST_REQUEST_RENDERER_CLASSES': [

        'rest_framework.renderers.MultiPartRenderer',

        'rest_framework.renderers.JSONRenderer'

    ],

    'TEST_REQUEST_DEFAULT_FORMAT': 'multipart',

 

    # Hyperlink settings

    'URL_FORMAT_OVERRIDE': 'format',

    'FORMAT_SUFFIX_KWARG': 'format',

    'URL_FIELD_NAME': 'url',

 

    # Encoding

    'UNICODE_JSON': True,

    'COMPACT_JSON': True,

    'STRICT_JSON': True,

    'COERCE_DECIMAL_TO_STRING': True,

    'UPLOADED_FILES_USE_URL': True,

 

    # Browseable API

    'HTML_SELECT_CUTOFF': 1000,

    'HTML_SELECT_CUTOFF_TEXT': "More than {count} items...",

 

    # Schemas

    'SCHEMA_COERCE_PATH_PK': True,

    'SCHEMA_COERCE_METHOD_NAMES': {

        'retrieve': 'read',

        'destroy': 'delete'

    },

}

 

 



 

 

 

 

 

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

from rest_framework import serializers

from user.models import User

deef address_validate(data)

#独立校验器

#rase serializers.ValidationError('请填写实际地址')#有错就抛出异常

#没错就返回数据

return data

#没错就返回数据

return data

class UserSerializer(serializers.ModelSerializer):

address=serializers.CharField(max_lenght=5,validators=[address_validate])

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

def valdate_address(self,data):

  if data=="测试":

      ralsse serializers.ValidationError('请填写实际地址)#有错就抛出异常

  return daata

def validate_phone(self,date):

#不符合手机格式

  model=self.root.Meta.model

  num=model.objects.filter(phone=data).count()  

  if num>0:
    raise serializers.ValidationError('手机号')
    return data
  def validate(self,attrs):
  return attrs
  class Meta:
  model=User
  fields='__all__'
  read_only_fields=('',)
  extra_kwargs={
  "address":{
  "min_length":5,
  "default":"默认测试地址"
   }
}

2.DRFr认证、权限、限流、分页、过滤、序列化、

2.、user/urls.py

from django.http import HttpResponse
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import viewsets
from rest_framework.authentication import BaseAuthentication, SessionAuthentication
from rest_framework.decorators import action
from rest_framework.filters import OrderingFilter
from rest_framework.permissions import AllowAny, IsAdminUser, 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 UserSerializer


# Create your views here.
def index(request):
return HttpResponse('hello')


class PageNum(PageNumberPagination):
page_size_query_param = 'page_size'
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):
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
pagination_class = PageNum
thorttle_classes=[UserRateThrottle]
filter_backends = (DjangoFilterBackend, OrderingFilter)
ordering_fields = ('date_joinde', 'id')
filter_fields = ('username', 'phone', 'is_active')

# def get_serializer_class(self):
# if self.action == 'uuactived':
# return UserUnActivSerializer
# else:
# return UserSerializer

posted @ 2020-10-28 20:08  王彬。  阅读(628)  评论(0)    收藏  举报