Rest framework-視圖組件

REST之視圖

GET :從服務(wù)器取出資源(一項(xiàng)或多項(xiàng))
POST :在服務(wù)器新建一個(gè)資源
PUT :在服務(wù)器更新資源(客戶端提供改變后的完整資源)
PATCH :在服務(wù)器更新資源(客戶端提供改變的屬性)
DELETE :從服務(wù)器刪除資源

book為例:

"books/$"   GET:獲取所有數(shù)據(jù)  
            POST:添加一條數(shù)據(jù)

"Book/1"    GET:獲取單條數(shù)據(jù)  
            DELETE:刪除一條數(shù)據(jù)   
            PUT/PATCH:更新一條數(shù)據(jù)

不加id的url

獲取數(shù)據(jù)

url.py

    url(r'^books/$',views.BookView.as_view()),

serializer.py

from app01.models import Book
class BookSerializers(serializers.ModelSerializer):
   class Meta:
       model=Book
       # 序列化所有數(shù)據(jù),與exclude不能并存
       fields="__all__"

   # # 這樣加上去之后,就是不要他創(chuàng)建的字段了,用我自己寫的自定義字段,有的話覆蓋,沒有的話添加
   # 
   # publish=serializers.CharField(source='publish.name',read_only=True)
   # 
   # # SerializerMethodField 聲明這是個(gè)多對(duì)多字段
   # authors=serializers.SerializerMethodField(read_only=True)
   # # 聲明好多對(duì)多字段,底下緊跟著定義一個(gè)方法
   # # 此時(shí)的obj就是你循環(huán)book_list的obj對(duì)象
   # def get_authors(self,obj):
   #     data=[]
   #     # for 循環(huán) 對(duì)象關(guān)聯(lián)Author表所有的對(duì)象
   #     for i in obj.authors.all():
   #         temp = []
   #         temp.append(i.pk)
   #         temp.append(i.name)
   #         data.append(temp)
   #     return data

views.py

from rest_framework.views import  APIView
from app01.serializer import PublishSerializers,BookSerializers
from app01.models import Book

class BookView(APIView):

    def get(self,request):
        book_list=Book.objects.all()
        ps=BookSerializers(book_list,many=True)
        # 序列化完成的數(shù)據(jù)
        return Response(ps.data)

添加一條數(shù)據(jù)

請(qǐng)先閱讀上一篇文章:Rest framework-request.data

views.py

class BookView(APIView):

    def get(self,request):
        book_list=Book.objects.all()
        ps=BookSerializers(book_list,many=True)
        # 序列化完成的數(shù)據(jù)
        return Response(ps.data)

    def post(self,request):
        # 添加一條數(shù)據(jù)
        # request.POST 在發(fā)JSON數(shù)據(jù)的時(shí)候是取不到值的,只有發(fā)urlecoding,orm-data才會(huì)有值
        # REST已經(jīng)對(duì)request再次封裝了,發(fā)送JSON,urlecoding,form-data等常用等常用的數(shù)據(jù)都封裝到data里了,這樣就解決了request.POST 在發(fā)JSON數(shù)據(jù)的時(shí)候是取不到值的情況
        print("data",request.data)
        print("POST",request.POST)
        # 生成一條記錄
        bs=BookSerializers(data=request.data)
        # 校驗(yàn)成功后生成記錄
        if bs.is_valid():
            bs.save()
            # 把添加的數(shù)據(jù)序列化返回
            return Response(bs.data)
        else:
            # 校驗(yàn)失敗返回錯(cuò)誤信息
            return Response(bs.errors)

image.png
image.png

加id的url

"books/$"   GET:獲取所有數(shù)據(jù)  
            POST:添加一條數(shù)據(jù)
# 上邊的我們上邊已經(jīng)演示過了
"Book/1"    GET:獲取單條數(shù)據(jù)  
            DELETE:刪除一條數(shù)據(jù)   
            PUT/PATCH:更新一條數(shù)據(jù)

urls.py

url(r'^books/$',views.BookView.as_view()),
# ?P<> 分組 
url(r'^books/(?P<pk>\d+)/$',views.BookDetailView.as_view()),

views.py

from rest_framework.views import  APIView
from app01.models import Book

class BookView(APIView):

    def get(self,request):
        book_list=Book.objects.all()
        ps=BookSerializers(book_list,many=True)
        # 序列化完成的數(shù)據(jù)
        return Response(ps.data)
    def post(self,request):
        # 添加一條數(shù)據(jù)
        # request.POST 在發(fā)JSON數(shù)據(jù)的時(shí)候是取不到值的,只有發(fā)urlecoding,orm-data才會(huì)有值
        # REST已經(jīng)對(duì)request再次封裝了,發(fā)送JSON,urlecoding,form-data等常用等常用的數(shù)據(jù)都封裝到data里了,這樣就解決了request.POST 在發(fā)JSON數(shù)據(jù)的時(shí)候是取不到值的情況
        print("data",request.data)
        print("POST",request.POST)
        # 生成一條記錄
        bs=BookSerializers(data=request.data)
        # 校驗(yàn)成功后生成記錄
        if bs.is_valid():
            bs.save()
            # 把添加的數(shù)據(jù)序列化返回
            return Response(bs.data)
        else:
            # 校驗(yàn)失敗返回錯(cuò)誤信息
            return Response(bs.errors)

class BookDetailView(APIView):

    def get(self,request,pk):
        # 根據(jù)pk值獲取數(shù)據(jù)庫(kù)對(duì)應(yīng)的一條對(duì)象
        book_obj=Book.objects.filter(pk=pk).first()
        # 序列化一個(gè)對(duì)象,默認(rèn)就為False
        bs=BookSerializers(book_obj,many=False)
        return Response(bs.data)

    def put(self,request,pk):
        book_obj=Book.objects.filter(pk=pk).filter()
        # 更新一定要傳兩個(gè)值
        # 第一個(gè)這次更新傳進(jìn)來的數(shù)據(jù)(data=request.data)
        # 第二個(gè)要更新的對(duì)象(instance=book_obj)
        bs=BookSerializers(data=request.data,instance=book_obj)
        if bs.is_valid():
            # 如果校驗(yàn)成功就updata
            bs.save()
            # 返回更新后的數(shù)據(jù)
            return Response(bs.data)
        else:
            # 返回錯(cuò)誤信息
            return Response(bs.errors)

    def delete(self,request,pk):
        Book.objects.filter(pk=pk).delete()
        return Response("OK")

GET:http://127.0.0.1:8000/books/2/

image.png

PUT:http://127.0.0.1:8000/books/2/

image.png

DELETE:http://127.0.0.1:8000/books/2/

image.png

現(xiàn)在我們?cè)趤砜聪滤袛?shù)據(jù)


image.png

額外知識(shí)

Django seetings.py配置文件中默認(rèn)沒有 APPEND_SLASH 這個(gè)參數(shù),但 Django 默認(rèn)這個(gè)參數(shù)為 APPEND_SLASH = True。 作用就是自動(dòng)在網(wǎng)址結(jié)尾加'/'。
默認(rèn)地,任何不匹配或尾部沒有斜杠(/)的申請(qǐng)URL,將被重定向至尾部包含斜杠的相同字眼的URL。
當(dāng) seetings.py 設(shè)置為 APPEND_SLASH = False 時(shí),訪問 網(wǎng)址最后不加/ 將會(huì)返回 404

1、第一次路徑匹配成功該返回什么返回什么
2、如果:第一次路徑匹配發(fā)現(xiàn)匹配不成功,但是再帶個(gè)/就就匹配成功了,Django會(huì)告訴路由器你再帶個(gè)url后面再加個(gè)/過來get請(qǐng)求發(fā)過來吧,所以是發(fā)了兩次請(qǐng)求,你仔細(xì)看下url地址欄的變化


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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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