django,api结构筛选、分页,软删除

定义api

在中间键文件夹下创建RenderResponse.py文件,里面定义api数据结构

1
from rest_framework.renderers import JSONRenderer
234
class CustomJsonRenderer(JSONRenderer):
5
    def render(self, data, accepted_media_type=None, renderer_context=None):
6
        """
7
        结构
8
        {
9
            'code':xxx,
10
            'msg':请求成功,
11
            'data':{返回数据}
12
        }
13
        """
14
        if renderer_context:
15

16
            if isinstance(data, dict):
            #如果没有就创建一个
17
                msg = data.pop('msg', '请求成功')
18
                code = data.pop('code', 0)
19
            else:
20
                msg = '请求成功'
21
                code = 0
22

23
            response = renderer_context['response']
24
            response.status_code = 200
25
            res = {
26
                'code': code,
27
                'msg': msg,
28
                'data': data
29
            }
30
            return super().render(res, accepted_media_type, renderer_context)
31
        else:
32
            return super().render(data, accepted_media_type, renderer_context)

然后在setting中配置该文件


1
# 配置restful api返回结果
23
REST_FRAMEWORK = {
4
    # 返回自定义结构
5
    'DEFAULT_RENDERER_CLASSES': (
6
        'utils.RenderResponse.CustomJsonRenderer',   # 自定义结构这个类的路径
7
    )
8
}

设置分页和筛选

配置分页和筛选

1
# 配置restful api返回结果时加上 筛选条件 如下:
23
REST_FRAMEWORK = {
4
    # 分页
5
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
6
    'PAGE_SIZE': '2',# 表示展示2个数据
78
    # 配置筛选 
9
    # 这里djangorestframework-3.8.2会报错,建议用djangorestframework-3.4.6
10
    # 卸载:pip uninstall djangorestframework==3.8.2
11
    # 安装:pip install djangorestframework==3.4.6
12

13
    'DEFAULT_FILTER_BACKENDS':('rest_framework.filters.DjangoFilterBackend',
14
                               'rest_framework.filters.SearchFilter'
15
                                ),
16

17
    # 返回自定义结构
18
    'DEFAULT_RENDERER_CLASSES': (
19
        'utils.RenderResponse.CustomJsonRenderer',
20
    )
21
}

定义筛选字段及方法

在app项目下创建py文件

from rest_framework import filters
import django_filters

from stu.models import Student


class Sttt(filters.FilterSet):
    # lookup_expr 表示选择查找方式
    # 'icontains'模糊查找
    name = django_filters.CharFilter('s_name', lookup_expr='icontains')
    # 不加表示精确查找
    tel = django_filters.CharFilter('s_tel')
    # 'gte'表示大于等于方案
    yuwen_min = django_filters.NumberFilter('s_yuwem', lookup_expr='gte')
    yuwen_max = django_filters.NumberFilter('s_yuwem', lookup_expr='lt')

    class Meta:
        model = Student
        # 高版本django必须写fields = [],里面的参数最好写上,也可以不写
        fields = []

在views.py下序列化的类中加入过滤类

filter_class = StuFilter

如何运用

一定要加“?”符号
筛选语文小于60的人

http://127.0.0.1:8000/stu/student/?yuwen_max=60

软删除

在django默认delete请求数据时会直接把数据库中的数据删除(),这样删除数据是及其危险的操作,为了安全,我们把删除的数据的s_delete字段设置为1,没有删除的s_delete字段设置为0;这样我们就需要重写mixins.DestroyModelMixin下destroy方法
说白了就是本来是del方法直接删除的,我们直接修改系统方法,设置数据库中数据为1,0,定义1显示出来,0不显示,就模拟了删除效果

修改views定义的类中参数

    # 对要显示的学生(前提是没被删除)进行排序 并且排序为id倒叙
    def get_queryset(self):
        query = self.queryset
        return query.filter(s_delete=0).order_by('-id')

    # 按照id倒序排序,filter(s_delete=0)表示学生还没有被删除,下面讲软删除
    # 重构delete请求方法,达到软删除目的
    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        instance.s_delete = 1
        instance.save()
        return Response({'msg': '删除成功', 'code': 200})

创建的数据库——同时创建字段(这里方法表示上面软删除的delete和返回对应字段方式)

class Student(models.Model):
    s_name = models.CharField(max_length=10)
    s_tel = models.CharField(max_length=11)
    s_yuwen = models.DecimalField(max_digits=3, decimal_places=1, null=True)
    STATUS = [
        ('NONE', '正常'),
        ('NEX', '留级')
    ]
    s_status = models.CharField(max_length=20, choices=STATUS, default='NONE')
    s_delete = models.BooleanField(default=0)

这里我们要将s_status字段中的信息返回给前端,但不是”NONE”,”NEX”……而是对应的”正常”,”留级”……

序列化中添加

把列表STATUS转换成字典后利用键值对取值
data[‘s_status’] = dict(Student.STATUS)[data[‘s_status’]]

猜你喜欢

转载自blog.csdn.net/qq_41781877/article/details/80233338
今日推荐