Django Rest_Framework之第三方插件的使用

一.过滤Filtering

对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-fitlter扩展来增强支持。
需要安装:

pip install django-filter

安装完成之后需要注册到INSTALLED_APPS中:

'django_filters',  #过滤

示例:

class StudentListAPIView(ListAPIView):
    serializer_class = StudentModelserializers
    queryset = Student.objects.all()
	
    filter_fields = ['age']  # 根据age查找需要的数据
    请求方式:
    http://127.0.0.1:8000/testhome/page_home/?age=22

结果:
Django Rest_Framework之第三方插件的使用_第1张图片

二.排序

对于列表数据,REST framework提供了OrderingFilter过滤器来帮助我们快速指明数据按照指定字段进行排序。

使用方法:

在类视图中设置filter_backends,使用rest_framework.filters.OrderingFilter过滤器,REST framework会在请求的查询字符串参数中检查是否包含了ordering参数,如果包含了ordering参数,则按照ordering参数指明的排序字段对数据集进行排序。

前端可以传递的ordering参数的可选字段值需要在ordering_fields中指明。

示例:

class StudentListAPIView(ListAPIView):
    serializer_class = StudentModelserializers
    queryset = Student.objects.all()

    # 排序
     filter_backends = [OrderingFilter,DjangoFilterBackend]
    ordering_fields = ['id','age']
    请求方式:
    http://127.0.0.1:8000/home/student_list/?ordering=age
    # 如果有数据重复 可以指定其他字段再排序
    # age 数据重复 根据id倒序排列
    # http://127.0.0.1:8000/home/student_list/?ordering=age,-id

三.分页PageNumberPagination

REST framework提供了分页的支持。

可以在settings.py中配置:

缺点:只要有listapiview 全部都会分页
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100  # 每页数目
}

注意:如果在视图内关闭全局分页功能,只需在视图内设置

pagination_class = None

局部配置:

from rest_framework.pagination import PageNumberPagination

class CustomPage(PageNumberPagination):

    # 页面展示最大几条
    max_page_size = 3

    # 默认展示几条
    page_size = 2

    # 页数关键字 值是页码
    page_query_param = 'page'

    # 每页数目关键字  最大是上面的max_page_size
    page_size_query_param = 'page_size'

视图集中使用:

class StudentListAPIView(ListAPIView):

    serializer_class = StudentModelserializers
    queryset = Student.objects.all()
    # 分页
    pagination_class = CustomPage

四.异常处理Exceptions

REST framework提供了异常处理,我们可以自定义异常处理函数。

# 数据库异常
from rest_framework.views import exception_handler
from rest_framework import status
from django.db import DatabaseError
from rest_framework.response import Response

def custom_excepton(exc, context):

    response = exception_handler(exc, context)

    if response is None:
        if isinstance(exc,DatabaseError):
            response = Response({'error':'服务器错误!!!!'},status=status.HTTP_507_INSUFFICIENT_STORAGE)

    return response

在配置文件中声明自定义的异常处理:写路径就行

# 自定义异常
'EXCEPTION_HANDLER': 'drfdemo.utils.exceptions.custmoer_exceptions',

REST framework定义的异常

  • APIException 所有异常的父类
  • ParseError 解析错误
  • AuthenticationFailed 认证失败
  • NotAuthenticated 尚未认证
  • PermissionDenied 权限决绝
  • NotFound 未找到
  • MethodNotAllowed 请求方式不支持
  • NotAcceptable 要获取的数据格式不支持
  • Throttled 超过限流次数
  • ValidationError 校验失败

也就是说,很多的没有在上面列出来的异常,就需要我们在自定义异常中自己处理了。

五.自动生成接口文档

REST framework可以自动帮助我们生成接口文档。

接口文档以网页的方式呈现。

自动接口文档能生成的是继承自APIView及其子类的视图。

安装第三方库:

pip install coreapi

配置文件加上这句:

'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema'

urls.py配置:

from rest_framework.documentation import include_docs_urls

urlpatterns = [
    ...
    path('docs/', include_docs_urls(title='站点页面标题'))
]

访问接口文档网页:
Django Rest_Framework之第三方插件的使用_第2张图片

六.Xadmin

xadmin是Django的第三方扩展,比使用Django的admin站点更强大也更方便。

文档:https://xadmin.readthedocs.io/en/latest/index.html

安装:

pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2

配置文件:

INSTALLED_APPS = [
    ...
    'xadmin',
    'crispy_forms',
    'reversion',
    ...
]

执行数据库迁移指令:

python manage.py makemigrations
python manage.py migrate

添加路由信息:

import xadmin
xadmin.autodiscover()

# version模块自动注册需要版本控制的 Model
from xadmin.plugins import xversion
xversion.register_models()

urlpatterns = [
    path(r'xadmin/', xadmin.site.urls),
]

使用:

  • xadmin不再使用Django的admin.py,而是需要编写代码在adminx.py文件中。
  • xadmin的站点管理类不用继承admin.ModelAdmin,而是直接继承object即可。

例如:在子应用中创建adminx.py文件。

全局配置+页面样式控制:

import xadmin
from xadmin import views

from student.models import Student


class BaseSetting(object):
    """xadmin的基本配置"""
    enable_themes = True  # 开启主题切换功能
    use_bootswatch = True

xadmin.site.register(views.BaseAdminView, BaseSetting)

class GlobalSettings(object):
    """xadmin的全局配置"""
    site_title = "test"  # 设置站点标题
    site_footer = "test"  # 设置站点的页脚
    menu_style = "accordion"  # 设置菜单折叠

xadmin.site.register(views.CommAdminView, GlobalSettings)


class StudentAdmin(object):

    list_display = ['id','name','sex','age','class_null','description']  # 展示字段
    search_fields = ['name','class_null']  # 搜索字段
    list_filter = ['sex','age'] 		   # 过滤器
    ordering = ['age']  				   # 按照age排序 升序
    show_detail_fields = ['name']  		   # 显示name字段的详细信息
    # list_editable = ['age','sex']        # 页面上可以编辑的字段
    refresh_times = [5,10,30,60]           # 指定列表页的定时刷新
    list_export = ['xls', 'xml', 'json']        # 导出的格式
    list_export_fields = ['id', 'name', 'age']   # 导出的字段
    show_bookmarks = True    # 是否隐藏书签功能

    data_charts = {            # 图标
        "members": {
            'title': '会员的年龄分布',
            "x-field": "age",
            "y-field": ['age'],
            "order": ('age',)
        },
        #    支持生成多个不同的图表
        #    "order_amount": {
        #      'title': '图书发布日期表',
        #      "x-field": "bpub_date",
        #      "y-field": ('btitle',),
        #      "order": ('id',)
        #    },
    }

    model_icon = 'fa fa-gift'  				# 修改标题图标
    readonly_fields = ['class_null','age']  # 编辑时只读字段 编辑时不可修改
    exclude = ['id']   						# 编辑时隐藏的字段

xadmin.site.register(Student,StudentAdmin)

你可能感兴趣的:(django,python)