安装:
– pip install djangorestframework
– pip install django-filter
建立serializers.py,代码如下:
from rest_framework import serializers
from stu.models import Student
class StudentSerializer(serializers.ModelSerializer,):
s_name = serializers.CharField(error_messages={
'blank': '用户名不能为空', # ---> 对空白进行处理
'max_length': '用户名不能超过10个字符串' # ---> 对最大长度进行处理 / 还可以对最小长度进行处理等...
}, max_length=10) # --->在这进行处理,避免数据库抛出错误信息.
s_tel = serializers.CharField(error_messages={
'blank': '电话不能为空'
})
class Meta:
model = Student # ---> 调用Student模型
fields = ['id', 's_name', 's_tel'] # ---> 序列化fileds中的字段, fields中的字段都将被序列化
def to_representation(self, instance): # ---> 创建了一个Student模型的对象
data = super().to_representation(instance) # ---> 将object对象转化成dict类型
# ---> 这里要处理异常, 因为Student表中创建了数据,可能studentinfo里面没有数据, 所以序列化的时候可能会出现问题, 处理如下:
try:
data['s_addr'] = instance.studentinfo.i_addr # ---> 通过一个Student的实例化对象去调用studentinfo的i_addr属性
except Exception as e:
data['s_addr'] = ''
return data
class StudentsEdit(mixins.ListModelMixin, # -->用于序列化 用于get检索所有信息进行排列
mixins.RetrieveModelMixin, #-->用于get检索 可以根据id进行检索
mixins.UpdateModelMixin, #-->用于patch, put更新
mixins.DestroyModelMixin, #--> 用于delete去删除数据
mixins.CreateModelMixin, #--> 用于post去创建数据
viewsets.GenericViewSet #--->用于去get所有的queryset信息,可以进行过滤,
):
# 查询所有信息
queryset = Student.objects.all() # --->得到一个学生表的全部数据
# 序列化
serializer_class = StudentSerializer # ---> 将serializer_class 赋值为 创建好的序列化Student的序列化模型 StudentSerializer
# 以上的信息是由继承的所有父类的方法自动去调用的, 必须固定写 queryset 和 serializer_class , 否则会出错.
from rest_framework.routers import SimpleRouter
router = SimpleRouter()
router.register(r'^student', views.StudentsEdit
)
urlpatterns = [
url(r'^stuPage/', login_required(views.stuPage)),
url(r'^index/', login_required(views.index)),
url(r'^addstu/', login_required(views.addStu), name='add'),
url(r'^addstuInfo/(?P\d+)/' , login_required(views.addStuInfo), name='addinfo'),
url(r'^ajax/', views.ajax),
url(r'^api-auth/', include('rest_framework.urls')),
url(r'^api/', include(StudentResource().urls))
]
urlpatterns += router.urls # -->将路径加入进去
<html>
<head>
<meta charset="UTF-8">
<title>title>
head>
<body>
{% csrf_token %}
<button id="get">获取学生信息button>
<a href="javascript:;" onclick="add_stu()">添加学生信息a>
<div id="message">
div>
<div id="div_update_stus">
div>
<div id="div_add_stus">
div>
<script src="/static/js/jquery.min.js" >script>
<script type="text/javascript">
function del_stu(id){
csrf = $('input[name="csrfmiddlewaretoken"]').val();
alert(id);
$.ajax({
url:'/stu/student/' + id + '/',
type:'delete',
headers:{'X-CSRFToken': csrf},
dataType:'json',
success:function(msg){
alert('删除成功');
},
error:function (msg) {
alert('删除失败')
}
});
}
function update_stu(i){
s= '姓名: 电话: ')">';
$('#div_update_stus').html(s)
}
function update(i){
csrf = $('input[name="csrfmiddlewaretoken"]').val();
s_name = $('#s_name').val();
s_tel = $('#s_tel').val();
$.ajax({
url:'/stu/student/' + i + '/',
type:'PATCH',
data:{'s_name': s_name, 's_tel': s_tel},
dataType:'json',
headers:{'X-CSRFToken':csrf},
success:function(msg){
alert('修改成功')
},
error:function (msg) {
alert('修改失败')
}
});
}
function add_stu(){
s= '姓名: 电话: ';
$('#div_add_stus').html(s)
}
function add(){
csrf = $('input[name="csrfmiddlewaretoken"]').val();
s_name = $('#s_name').val();
s_tel = $('#s_tel').val();
$.ajax({
url:'/stu/student/',
type:'POST',
data:{'s_name': s_name, 's_tel': s_tel},
dataType:'json',
headers:{'X-CSRFToken':csrf},
success:function(msg){
{#如果添加成功了返回msg是获取到响应的所有的对象#}
{#alert(msg);#}
alert('添加成功')
},
error:function (msg) {
alert('添加失败')
}
});
}
$(function(){
csrf = $('input[name="csrfmiddlewaretoken"]').val();
var myurl = '/stu/student/';
$('#get').on('click', function(){
$.ajax({url:myurl, type:'get', headers:{'X-CSRFToken': csrf}, async:true, dataType:'json',success:function(data){
console.log(data.data);
var s = 'id 姓名 电话 操作 ';
for(var i=0; i < data.data.length; i +=1){
console.log(data[i]);
s += '' + data[i].id + ' ' + data[i].s_name + ' ' + data[i].s_tel +
' ' + '')">编辑|' +
'')">删除' + ' ';
}
s += '
';
$('#message').html(s);
}
})
});
})
script>
body>
html>
# 配置restful api 返回结果
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'utils.RenderResponse.CustomJsonRenderer',
)
}
from rest_framework.renderers import JSONRenderer
class CustomJsonRenderer(JSONRenderer):
def render(self, data, accepted_media_type=None, renderer_context=None):
"""
格式
{
'code': xxx,
'msg': 请求成功.
data: {返回数据}
}
"""
if renderer_context: # ---> renderer_context 如果有内容:
if isinstance(data, dict): # --->推断data是否是dict类型
msg = data.pop('msg', '请求成功') # --->如果有msg,删除键,返回值,命名msg=值,没有msg键,命名msg = '请求成功' pop(删除的键, 没有键返回的默认值)
code = data.pop('code', 0) # --->如果有code,删除code键, 返回值,命名code=值, 如果没有code键,则重新命名code = '0'
else: #
msg = '请求成功'
code = 0
response = renderer_context['response'] # ---> 获取response信息
response.status_code = 200 # ---> 将response.ststus_code, 如果请求成功的全部返回200的状态码
res = {
'code':code,
'msg':msg,
'data':data
}
return super().render(res, accepted_media_type, renderer_context) # --->调用父类的render方法,和跳转的render不是一个方法, 下同
else:
return super().render(data, accepted_media_type,renderer_context)