Django_REST_Framework入門(1)啟動API

Pizza
Pizza’s
Published in
17 min readFeb 26, 2020

1. 安裝DRF

(base) [cabie@centosclean 01_python]$ pip install djangorestframework
Collecting djangorestframework
Downloading https://files.pythonhosted.org/packages/be/5b/9bbde4395a1074d528d6d9e0cc161d3b99bd9d0b2b558ca919ffaa2e0068/djangorestframework-3.11.0-py3-none-any.whl (911kB)
|████████████████████████████████| 911kB 738kB/s
Requirement already satisfied: django>=1.11 in /home/cabie/anaconda3/lib/python3.7/site-packages (from djangorestframework) (3.0.3)
Requirement already satisfied: asgiref~=3.2 in /home/cabie/anaconda3/lib/python3.7/site-packages (from django>=1.11->djangorestframework) (3.2.3)
Requirement already satisfied: pytz in /home/cabie/anaconda3/lib/python3.7/site-packages (from django>=1.11->djangorestframework) (2019.3)
Requirement already satisfied: sqlparse>=0.2.2 in /home/cabie/anaconda3/lib/python3.7/site-packages (from django>=1.11->djangorestframework) (0.3.0)
Installing collected packages: djangorestframework
Successfully installed djangorestframework-3.11.0
  • start project
(base) [cabie@centosclean 001_django_REST_API]$ django-admin startproject drf
(base) [cabie@centosclean 001_django_REST_API]$ ls
drf

2. 基本設定

2–1. settings.py : 在INSTALLED_APPS 加入下方程式碼 (下圖)

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
]

2–2. 建立新的APP

通常我們都會依照功能建立一個APP,例如我們這裡建立一個Github User資訊。

(base) [cabie@centosclean drf]$ python manage.py startapp github_user
(base) [cabie@centosclean drf]$ ls
drf github_user manage.py

2–3. 將新APP加入 settings.py

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'github_user',
]

3. Models設定

透過設定 models.py 我們可以設定資料庫中的結構(Schema),並透過Django指令去建立資料庫。
Django預設是使用SQLite,若想要更換為其他資料庫,可以在settings.py中設定。
首先我們先來設定新APP下的models.py,它們是繼承自 django.db.models.Model的子類, 可以包括屬性,方法和描述性資料(metadata),設定如下:

  • models.py
from django.db import models# Create your models here.# 這裡我們設定Github User的Schema
class Github(models.Model):
user = models.TextField()
location = models.TextField()
last_modify_date = models.DateTimeField(auto_now=True) #auto_now=Ture(在每次保存模型時將該字段設置為當前日期)
created = models.DateTimeField(auto_now_add=True) #auto_now_add(僅設置模型首次創建時的日期)

class Meta:
db_table = "github_user"

<補充>常用字段類型

以下列表描述了一些更常用的字段類型。

  • CharField 是用來定義短到中等長度的字段字符串。你必須指定max_length要存儲的數據。
  • TextField 用於大型任意長度的字符串。你可以max_length為該字段指定一個字段,但僅當該字段以表單顯示時才會使用(不會在數據庫級別強制執行)。
  • IntegerField 是一個用於存儲整數(整數)值的字段,用於在表單中驗證輸入的值為整數。
  • DateFieldDateTimeField 用於存儲/表示日期和日期/時間信息(分別是Python.datetime.datedatetime.datetime 對象)。這些字段可以另外表明(互斥)參數 auto_now=Ture (在每次保存模型時將該字段設置為當前日期),auto_now_add(僅設置模型首次創建時的日期)和 default(設置默認日期,可以被用戶覆蓋)。
  • EmailField 用於存儲和驗證電子郵件地址。
  • FileFieldImageField 分別用於上傳文件和圖像(ImageField 只需添加上傳的文件是圖像的附加驗證)。這些參數用於定義上傳文件的存儲方式和位置。
  • AutoField 是一種 IntegerField 自動遞增的特殊類型。如果你沒有明確指定一個主鍵,則此類型的主鍵將自動添加到模型中。
  • ForeignKey 用於指定與另一個數據庫模型的一對多關係(例如,汽車有一個製造商,但製造商可以製作許多汽車)。關係的“一”側是包含密鑰的模型。
  • ManyToManyField 用於指定多對多關係(例如,一本書可以有幾種類型,每種類型可以包含幾本書)。在我們的圖書館應用程序中,我們將非常類似地使用它們 ForeignKeys,但是可以用更複雜的方式來描述組之間的關係。這些具有參數 on_delete 來定義關聯記錄被刪除時會發生什麼(例如,值 models.SET_NULL 將簡單地設置為值 NULL )。

還有許多其他類型的字段,包括不同類型數字的字段(大整數,小整數,浮點數),布林值,URLs,唯一 ids 和其他 “時間相關” 的信息(持續時間,時間等)。你可以查閱完整列表 .

<補充> Django model中的meta选项

通過一個內嵌類“class Meta”給你的model定義元數據
Model 元数据就是:不是一个字段的任何数据
比如排序选项,admin选项等等。

如上面的範例,db_table是用於指定自定義數據庫表名的。 Django有一套默認的按照一定規則生成數據模型對應的數據庫表名,如果你想使用自定義的表名,就通過這個屬性指定。

4. migrations

  • makemigrations : 會幚你建立一個檔案,去記錄你更新了哪些東西。
  • migrate : 根據 makemigrations 建立的檔案,去更新你的 DATABASE 。
(base) [cabie@centosclean github_user]$ python ../manage.py makemigrations
Migrations for 'github_user':
migrations/0001_initial.py
- Create model Music
(base) [cabie@centosclean github_user]$ python ../manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, github_user, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying github_user.0001_initial... OK
Applying sessions.0001_initial... OK

上面class名稱錯誤,在migrate一次

(base) [cabie@centosclean github_user]$ python ../manage.py makemigrations
Did you rename the github_user.Music model to Github? [y/N] y
Migrations for 'github_user':
migrations/0002_auto_20200221_1906.py
- Rename model Music to Github
(base) [cabie@centosclean github_user]$ python ../manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, github_user, sessions
Running migrations:
Applying github_user.0002_auto_20200221_1906... OK

執行完可以去看一下SQLite來觀看DATABASE,你會發現有一個github_user的table。

(base) [cabie@centosclean drf]$ sqlite3 db.sqlite3
SQLite version 3.30.0 2019-10-04 15:03:17
Enter ".help" for usage hints.
sqlite> .tables
auth_group django_admin_log
auth_group_permissions django_content_type
auth_permission django_migrations
auth_user django_session
auth_user_groups github_user
auth_user_user_permissions
sqlite>
sqlite> .tables
auth_group django_admin_log
auth_group_permissions django_content_type
auth_permission django_migrations
auth_user django_session
auth_user_groups github_user
auth_user_user_permissions
sqlite> .schema github_user
CREATE TABLE IF NOT EXISTS "github_user" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "user" text NOT NULL, "location" text NOT NULL, "last_modify_data" datetime NOT NULL, "created" datetime NOT NULL);
sqlite>

5. 序列化 Serializers

透過序列化我們可以將python轉換成其他格式,例如我們最常用的json。
下面我們在github_user中新增一個serializers.py的檔案:

  • serializers.py
from rest_framework import serializers
from github_user.models import Github
class GithubSerializer(serializers.ModelSerializer):
class Meta:
model = Github
#fields = '__all__' #或用此句代表全部fields都要
fields = ("id","user","location","last_modify_date","created")

當然還有很多的序列化設定,可以去參考SerializerMethodField 使用方法。

6. 設定Views

我們在Django有Views,但在DRF中他有提供一個叫viewsets,以下我們在views.py做設定:

from django.shortcuts import renderfrom github_user.models import Github
from github_user.serializers import GithubSerializer
from rest_framework import viewsets
# Create your views here.
# 只要這樣寫就擁有 CRUD 的全部功能
class GithubViewset(viewsets.ModelViewSet):
queryset = Github.objects.all()
serializer_class = GithubSerializer

因為 DRF 的 viewsets.ModelViewSet 裡面幫你定義了這些功能。

7. 設定urls(路由) 是drf的 urls.py

  • urls.py
"""drf URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from rest_framework.routers import DefaultRouter
from github_user import views
router = DefaultRouter()
router.register(r'github_user', views.GithubViewset)
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include(router.urls))
]

8. 執行Django

  • 先確定有將ip設定到 settings.py的ALLOWED_HOSTS = ["192.168.1.108"]
  • 啟動Django
(base) [cabie@centosclean drf]$ python manage.py runserver 0.0.0.0:8000
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
February 21, 2020 - 20:00:20
Django version 3.0.3, using settings 'drf.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
Not Found: /

用Postman也有

--

--