定义api
在中间键文件夹下创建RenderResponse.py文件,里面定义api数据结构
1
from rest_framework.renderers import JSONRenderer
2
3
4
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返回结果
2
3
REST_FRAMEWORK = {
4
# 返回自定义结构
5
'DEFAULT_RENDERER_CLASSES': (
6
'utils.RenderResponse.CustomJsonRenderer', # 自定义结构这个类的路径
7
)
8
}
设置分页和筛选
配置分页和筛选
1
# 配置restful api返回结果时加上 筛选条件 如下:
2
3
REST_FRAMEWORK = {
4
# 分页
5
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
6
'PAGE_SIZE': '2',# 表示展示2个数据
7
8
# 配置筛选
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的人
软删除
在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’]]