Django用restful實(shí)現(xiàn)數(shù)據(jù)的增刪改查

一、安裝環(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é)生信息


image.png

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


image.png

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


image.png

直接輸入修改的內(nèi)容,點(diǎn)擊put,即修改成功

d.刪除指定學(xué)生的信息
步驟b的操作搜索指定的學(xué)生,點(diǎn)擊頁面DELETE按鈕,即可刪除該條記錄


image.png

三、自定義數(shù)據(jù)返回結(jié)構(gòu)

頁面默認(rèn)返回的msg結(jié)構(gòu)如下:


image.png

很顯然這并不是我們想要的結(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)行修改。


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容