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)


加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/

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

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

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

額外知識(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
