对于列表数据可能需要根据字段进行过滤,我们可以通过添加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
对于列表数据,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
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
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可以自动帮助我们生成接口文档。
接口文档以网页的方式呈现。
自动接口文档能生成的是继承自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='站点页面标题'))
]
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),
]
使用:
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)