Django中restframework 的返回自定义结构、字段验证、
这篇博客基于我之前的博客[Django 中 restframework 配置与增删改查操作]:
返回学生的所有数据;
自定义结构:
在setting中配置app,INSTALLED_APPS中加入rest_framework,在文件最后定义rest_framework的接口。代码如下:
REST_FRAMEWORK = {
#返回结构自定义
'DEFAULT_RENDERER_CLASSES':(
'utils.render_response.CustomJsonRenderer',
)
}
我们定义一个中间件py文件为render_response,代码如下:
from rest_framework.renderers import JSONRenderer
class CustomJsonRenderer(JSONRenderer):
def render(self, data, accepted_media_type=None, renderer_context=None):
"""
格式{
'code':xxx,
'msg':请求成功,
'data':{返回数据}
}
"""
#如果返回的data为字典 中有msg的key 则将内容改为请求成功 code 为0
# 如果不是字典则将msg 定义为返回成功 code为0
# 再将完整的res数据传入
if renderer_context:
if isinstance(data,dict):
msg = data.pop('msg','请求成功')
code = data.pop('code',0)
else:
msg = '返回成功'
code = 0
response = renderer_context['response']
response.status_code = 200
res={
'code':code,
'msg':msg,
'data':data
}
return super().render(res,accepted_media_type,renderer_context)
else:
return super().render(data,accepted_media_type,renderer_context)
返回格式如下:
字段验证
在StudentSerializer
中加入以下字段:
验证s_name是否为空,长度是否大于10个长度。
s_name = serializers.CharField(error_messages={
'blank':'用户名不能为空',
'max_length' :'用户名最大长度为10'
},max_length=10)
你想要验证的东西可查看CharField的函数,里面的部分内容为:
self.allow_blank = kwargs.pop('allow_blank', False)
self.trim_whitespace = kwargs.pop('trim_whitespace', True)
self.max_length = kwargs.pop('max_length', None)
self.min_length = kwargs.pop('min_length', None)
其他字段也可进行验证。这是一样的道理。
分页
在seting中配置api接口,并别忘记在setting中配置app,INSTALLED_APPS中加入rest_framework,
REST_FRAMEWORK = {
# 分页
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE':2,
}
结果如下图所示:
next为下一页的地址,previous代表前一页,count是一共有多少条数据。这样可以清晰地看到数据的分页情况。
搜索
在seting中配置api接口
REST_FRAMEWORK = {
# 设置搜索
'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',
'rest_framework.filters.SearchFilter'),
}
这里注意我的安装包版本为:django-filter==1.1.0 djangorestframework==3.4.6,如果为最新安装,可能语句会发生变化。
过滤
在中间件中增加个filter.py文件,代码如下:
from rest_framework import filters
import django_filters
from stu.models import Student
class StuFilter(filters.FilterSet):
# 后端接口自定义过滤信息
name = django_filters.CharFilter('s_name', lookup_expr='icontains')
tel = django_filters.CharFilter('s_tel')
status = django_filters.CharFilter('s_status')
operate_time_min = django_filters.DateFilter('s_operate_time', lookup_expr='gt')
operate_time_max = django_filters.DateFilter('s_operate_time', lookup_expr='lt')
yuwen_min = django_filters.NumberFilter('s_yuwen', lookup_expr='gte')
yuwen_max = django_filters.NumberFilter('s_yuwen', lookup_expr='lte')
class Meta:
model = Student
# fields[] 必须存在 可为空 不然会报错
fields = []
model代码如下:
class Student(models.Model):
s_name = models.CharField(max_length=20)
s_tel = models.CharField(max_length=11)
s_yuwen = models.DecimalField(max_digits = 3,decimal_places=1,null=True)
s_operate_time = models.DateTimeField(null=True)
#软删除
s_delete = models.BooleanField(default=0)
class Meta:
db_table='day5_student'
现在来做实验:
例如:
过滤语文成绩不及格的学生,postman里输入http://127.0.0.1:8080/stu/student/?yuwen_max=60
皆可以看到结果,相当于将语文成绩最大值为60的参数传递进去,就是小于60分的学生。
其他的参数也可进行传递,自己调试便可。
排序
class StudentsEdit( mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.CreateModelMixin,
viewsets.GenericViewSet):
#查询所有信息
queryset = Student.objects.all()
#序列化
serializer_class = StudentSerializer
#排序 在排序的基础上再定义过滤条件
def get_queryset(self):
query =self.queryset
return query.filter(s_delete=0).order_by('-id')
结果如下:
删除
class StudentsEdit( mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.CreateModelMixin,
viewsets.GenericViewSet):
#查询所有信息
queryset = Student.objects.all()
#序列化
serializer_class = StudentSerializer
def destroy(self, request, *args, **kwargs):
isinstance = self.get_object()
isinstance.s_delete=1
isinstance.save()
return Response({'msg':'删除成功','code':200})
结果如下: