一、安裝環(huán)境
pip install djangorestframework
pip install django-filter
二、創(chuàng)建一個(gè)API實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的增刪改查
1.配置INSTALLED_APPS
把rest_framework添加在INSTALLED_APPS模塊中
INSTALLED_APPS = [
# 在此處添加
'rest_framework',
]
2.配置url
此處配置url地址時(shí)需要注意的是正則表達(dá)式中不需要添加"/" ,此處會(huì)自動(dòng)添加。綁定的StudentEdit是類而不是方法。
from rest_framework.routers import SimpleRouter
# 實(shí)例化 簡單路由
router = SimpleRouter()
router.register(r'^student', views.StudentEdit)
urlpatterns += router.urls
3.創(chuàng)建views
mixins.ListModelMixin 查詢?nèi)坑涗洠?br>
mixins.RetrieveModelMixin 查詢某一條記錄;
mixins.UpdateModelMixin 更新一條記錄;
mixins.DestroyModelMixin 刪除一條記錄;
mixins.CreateModelMixin 增加/創(chuàng)建一條記錄。
class StudentEdit(mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.CreateModelMixin,
viewsets.GenericViewSet):
# 查詢所有信息
queryset = Student.objects.all()
# 序列化
serializer_class = StudentSerializer
4.創(chuàng)建類
新建一個(gè)py文件,通常命名為serializer.py,在這個(gè)文件中創(chuàng)建一個(gè)類,繼承serializers.ModelSerializer類,fields指定返回的字段,如果需要返回的字段還有其他表中的字段,可通過重寫to_representation方法,把需要的字段加入返回的數(shù)據(jù)中。
from rest_framework import serializers
from stu.models import Student
class StudentSerializer(serializers.ModelSerializer):
class Meta:
# 指定數(shù)據(jù)庫
model = Student
# 指定從數(shù)據(jù)庫返回的字段
fields = ['id', 's_name', 's_tel']
def to_representation(self, instance):
# 序列化 instance 表示實(shí)例
data = super().to_representation(instance)
try:
# 如果數(shù)據(jù)庫中 i_addr 值為空,會(huì)發(fā)生異常,可以進(jìn)行異常處理
data['i_addr'] = instance.studentinfo.i_addr
except Exception as e:
data['i_addr'] = ''
return data
5.實(shí)現(xiàn)效果
a.通過地址:xxxx/student/ 可獲取全部學(xué)生信息

b.通過地址:xxxx/student/id/ 獲取指定學(xué)生的信息

c.修改指定學(xué)生的信息
步驟b的操作可以搜索出指定學(xué)生的信息,在頁面上可以看到如下內(nèi)容:

直接輸入修改的內(nèi)容,點(diǎn)擊put,即修改成功
d.刪除指定學(xué)生的信息
步驟b的操作搜索指定的學(xué)生,點(diǎn)擊頁面DELETE按鈕,即可刪除該條記錄

三、自定義數(shù)據(jù)返回結(jié)構(gòu)
頁面默認(rèn)返回的msg結(jié)構(gòu)如下:

很顯然這并不是我們想要的結(jié)構(gòu),那么我們可以通過下面的方式重新定義返回結(jié)構(gòu)。
1.繼承JSONRenderer類,重構(gòu)render方法
from rest_framework.renderers import JSONRenderer
class CustomJsonRenderer(JSONRenderer):
def render(self, data, accepted_media_type=None, renderer_context=None):
"""
格式
{
'code': xxx,
'msg': 請(qǐng)求成功,
data: {返回?cái)?shù)據(jù)}
}
"""
if renderer_context:
if isinstance(data, dict):
# pop(參數(shù)1,參數(shù)2) 若參數(shù)1不存在,默認(rèn)取參數(shù)2的值
msg = data.pop('msg', '請(qǐng)求成功')
code = data.pop('code',0)
else:
msg = '請(qǐng)求成功'
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)
2.配置setting.py
'utils.RenderResponse.CustomJsonRenderer'是重構(gòu)的render方法所在的文件路徑
# 配置restful api 返回結(jié)果
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'utils.RenderResponse.CustomJsonRenderer',
)
}
3.設(shè)置錯(cuò)誤提示信息
在StudentSerializer類中設(shè)置錯(cuò)誤提示信息后,當(dāng)用戶發(fā)出patch、post等請(qǐng)求時(shí),若用戶提交的數(shù)據(jù)不符合我們規(guī)定的數(shù)據(jù)要求,可以返回提示信息,但默認(rèn)的提示信息是英文,我們可以根據(jù)項(xiàng)目需求修改為我們想要的內(nèi)容。
如下:設(shè)置當(dāng)用戶名為空時(shí),返回錯(cuò)誤信息:用戶名不能為空;當(dāng)用戶名超出規(guī)定的最大長度時(shí),返回錯(cuò)誤信息:用戶名太長了。當(dāng)電話號(hào)碼為空時(shí),返回錯(cuò)誤信息:電話不能為空;當(dāng)電話號(hào)碼長度小于11或大于11時(shí),都返回錯(cuò)誤信息:電話號(hào)碼必須為11位。
# 設(shè)置錯(cuò)誤提示信息
s_name = serializers.CharField(error_messages={
'blank': '用戶名不能為空',
'max_length': '用戶名太長了'
}, max_length=10)
s_tel = serializers.CharField(error_messages={
'blank': '電話不能為空',
'max_length': '電話號(hào)碼必須為11位',
'min_length': '電話號(hào)碼必須為11位'
}, max_length=11, min_length=11)
點(diǎn)擊CharField,查看fields.py文件,文件中CharField類中有四個(gè)錯(cuò)誤提示值:
invalid 無效值;blank 值為空;max_length 值的最大長度;min_length 值的最小長度。當(dāng)發(fā)生上面四種錯(cuò)誤時(shí),就會(huì)返回這個(gè)錯(cuò)誤對(duì)應(yīng)的內(nèi)容,我們可以對(duì)這個(gè)內(nèi)容進(jìn)行修改。
