iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
Modern Web

傳承D的意志~ 邁向Django的偉大航道系列 第 19

[Day 19] 實戰篇: 你一定得會的CRUD(下集)

  • 分享至 

  • xImage
  •  

嗨大家好,我是Sean!
昨天我們講到CRUD的R的延伸使用,今天我們就來把CRUD全部結束!

Update


update的前提是我們已經可以選出單一筆的資料。我們在前面的list的部分,已經可以做到這件事。
但我們其實可以運用之前有介紹過的generics api view,使用複合功能的api view來達成這件事。

另一方面也是展現RESTful api的強大之處,利用無狀態的特性,接收request中的method來改變功能。

PUT


update的功能,可以使用post或update的方法來實踐,我們的做法是選擇用put的method來做。
我們可以使用我們之前已經寫完的model以及serializer,引用他們便可以完成我們api了。

from .models import People
from .serializers import PeopleSerializer
from rest_framework import generics

class PeopleUpdateAPIView(generics.RetrieveUpdateAPIView):
    queryset = People.objects.all()
    serializer_class = PeopleSerializer 

完成以上的功能,接著在寫完我們路徑後,就可以來啟動網頁來試試看api的效果。
特別值得一提的是,當我們使用update的api時,我們在路徑中加入參數,讓api可以直接依照pk(primary key)找到我們想找到的資料。

在路徑中加入參數的方法,如下方所示:

urlpatterns = [
    path('admin/', admin.site.urls),
    ...,
    path('api/data/update/<int:pk>', PeopleUpdateAPIView.as_view(), name='api-data-update'),
    # 我們新增路徑,在update後加入 /<int:pk>
]

接著再啟動我們的網頁,到達我們剛剛所添加的路徑。

https://ithelp.ithome.com.tw/upload/images/20221004/20151096BmEbj2Sk5q.png

get的method直接return給我們pk=1的那筆data,而在下方form的部分,表格內已經幫我們填好了現有的data。
我們可以在api的頁面,直接update這筆資料的內容,藉由下方的put按鈕。

依照慣例這樣對我們來說是不夠的,我們一樣用Postman做一次示範api測試。
如果直接使用get的話,一樣是回傳這筆資料。唯一的差別只是Postman上是JSON的格式。
https://ithelp.ithome.com.tw/upload/images/20221004/201510963bhUy4bu25.png

那麼,我們現在改變method為put,來做這筆資料update
我們複製剛剛JSON格式的資料,將它貼上在BODY的地方,再把形式選成raw以及JSON。

我們再更改JSON格式中的資料,就可以輕易地做到update的功能了。
如畫面所示,我們將age從20改到了25,我們再往下送出請求看看。
https://ithelp.ithome.com.tw/upload/images/20221004/20151096q57RKHnrGq.png

送出請求後,我們可以看到下面的response已經更新了變成25!這麼一來,update就已經成功了。
https://ithelp.ithome.com.tw/upload/images/20221004/20151096F6ZSojOKmQ.png

Delete


刪除的作法其實與更新大同小異,同樣的前提是,它也需要先選取個別的資料,才能指定資料做刪除。

但我們甚至可以用上面的做法,新增有Delete的api view就可以成功使用刪除的功能了!

就像以下這樣,只需要將請求的method改為delete就可以完成了:

from .models import People
from .serializers import PeopleSerializer
from rest_framework import generics

class PeopleUpdateAPIView(generics.RetrieveUpdateDeleteAPIView): # 新增delete
    queryset = People.objects.all()
    serializer_class = PeopleSerializer 

那麼,我們今天的文章就先到此結束囉!
我是Sean,你各位海上的人,我們明天見!

https://ithelp.ithome.com.tw/upload/images/20221004/20151096DHIvqYHOgv.jpg


上一篇
[Day 18] 實戰篇: 你一定得會的CRUD(中集)
下一篇
[Day 20] 實戰篇: 飛上雲端! GCP之部署(上)
系列文
傳承D的意志~ 邁向Django的偉大航道30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言