Try   HackMD

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

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Server-> serializer -> client
抓 Server 的 model 到 view 裡做 serializer 資料格式,讓 client 端可以透過 API 給 Server 需要的格式。
由於是從 Database Model 抓的 Object 所以不需要驗證資料的格式

Serializer.py

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

  • partial = True, 允許部份資料更新, 像我們 POST 上去的資料,不可能每個欄位都 POST ,那就可以使用 partial =True,可以部份資料更新就好。
  • require =False,可以允許 nested (JSON list) 為 None。
  • many =True,可以處理 list 中的 objects 。