# 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 。