# Django API 筆記 ## 流程 * 建model, 自訂 migration 才能讓 raw data import 到 model database。 * 建立 model Manager() import model ,建立 view call manager 的 function,再 return response。 # Model * CASCADE: 刪除 model 時,會跟著關聯的model一起刪除 * related_name: 在 foreign key 設定 related_name 可以讓 models 使用, User.objects.get(id=1).purchaehistory.all() * 為什麼 DateTimefield 設定 blank=True, null=True? null = True, 允許字串是NULL。 blank = True , 允許表單輸入值是空的 ## Migrations 寫一個 load json data 的程式,將 json 資料轉成 python 物件,再呼叫 django models 物件,依照物件屬性儲存 。 ## QuerySet 一個 QuerySet 代表著資料庫的一個物件,執行 User.objects.all() ,會返回包含著在資料庫物件的 QuerySet 。 ## model.Manager 用法 給予 model 能操作資料庫。 ``` class BookStore(models.Model) objects = models.Manager() ``` 在 BookStore 的模型,呼叫 BookStore.objects.all(), 就能呼叫出 BookStore 所有物件的資料。 ### 自定義 Manager 自定義 Manager, 可以添加額外的 method, 俢改 Manager 返回的 QuerySet. 可以直接呼叫 Bookstore.objects.list() example. ``` repo/book_store.py class BookStoreManager(models.Manager): def list(): return ``` ``` model.py class BookStore(models.Model): objects = BookStoreManager() ``` #### 操作 django shell ``` # _set 呼叫 foreign key 的 table User.objects.first().purchasehistory_set.all() ``` ## Django view render 在 view.py 設定 import model 的資料,才能導到網頁上 ``` from .models import * orders = Order.objects.all() customers = Customer.objects.all() content = {'order': orders, 'customer':'customers'} return render(request, 'accounts/dashboard.html', content) ``` ## Django CRUD ## User_name_date_range_total_amount ### 用到 Django ORM 的功能 * objects.values(),return 每個在 table field 的 key, value * objects.filter(),return 新的 queryset, 其中包含著 filter 的物件。 * 加總:annotate(Sum()), annotate 會return QuerySet 每個 objects. * 排序、Limit: order_by()[:n] ``` User.objects.values('name').filter(purchasehistory__transaction_date__range=['2021-04-01', '2021-05-20']).aanotate(Sum('purchasehistory__transaction_amount')) ``` # Django Rest Framework # 後端 在 Web 後端中,我們要先將 JSON objects, deserializer 才能 將 JSON 裡的資料做處理, 反之要將資料呈現給 client 端,就要將資料 serilaizer。 Django 本身沒有支援 GET, POST 這些 HTTP method,要透過 Django REST framwork。 Django Restframewrok 提供: * Serializer * Deserializer * 與 Model 對應的 Data validator ### update() 只能更新主 table, 不能更新 child table ## model 因為 POST 時,可能不會每個資料欄位都 POST ,所以將 null, blank 設成 trul。foreign key(null=True, blank = True)。 # Serializer ![](https://i.imgur.com/2D5U0sA.png) Server-> serializer -> client 抓 Server 的 model 到 view 裡做 serializer 資料格式,讓 client 端可以透過 API 給 Server 需要的格式。 由於是從 Database Model 抓的 Object 所以不需要驗證資料的格式 ## Serializer.py ![](https://i.imgur.com/4paoVbR.png) * partial = True, 允許部份資料更新, 像我們 POST 上去的資料,不可能每個欄位都 POST ,那就可以使用 partial =True,可以部份資料更新就好。 * require =False,可以允許 nested (JSON list) 為 None。 * many =True,可以處理 list 中的 objects 。