Django中restframework 的自定义结构、字段验证、分页、过滤、搜索

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

结果如下:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/Lq_520/article/details/81408795
今日推荐