Django – 模型層以及如何通過模型層來建表
- 2020 年 3 月 27 日
- 筆記
模型
Django 提供了一個抽象的模型 ("models") 層,
- 什麼是模型層?
- 這裡模型的思想與Java中的ORM(Object Relationship Mapping) 對象關係映射類似
- 模型準確且唯一的描述了數據
- 它包含要儲存的數據的欄位
- 一般來說,每一個模型都映射一張資料庫表
- 如何創建模型?
- 每個模型都是一個 Python 的類,這些類繼承
django.db.models.Model
- 模型類的每個屬性都相當於一個資料庫的欄位
- 利用這些,Django 提供了一個自動生成訪問資料庫的 API,可以通過這些API對資料庫進行增刪改查
- 每個模型都是一個 Python 的類,這些類繼承
- Settings.py 文件中增加一些配置
- INSTALLED_APPS:定義了你的模型後,需要將模型添加到Django,所以需要將包含models的模組名稱添加進去
- DATABASES:資料庫連接資訊
- 定義一個Person模型
- first_name 和 last_name 是模型的 欄位
- 每個欄位都被指定為一個類屬性,並且每個屬性映射為一個資料庫列。
程式碼實例
- 當前項目的目錄結構

- 包含models.py 所在目錄名稱為:signtest,將它添加到settings.py

- settings.py中增加資料庫的連接資訊(我這裡使用的是mysql)
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '127.0.0.1', # 資料庫主機 'PORT': 3306, # 資料庫埠 'USER': 'root', # 資料庫用戶名 'PASSWORD': 'abcd123456', # 資料庫用戶密碼 'NAME': 'my_dj_test' # 資料庫名字 } }
- models.py 中增加模型類
from django.db import models class Musician(models.Model): first_name = models.CharField(max_length=50) #每個變數對應的是資料庫中每個欄位 last_name = models.CharField(max_length=50) instrument = models.CharField(max_length=100) class Album(models.Model): artist = models.ForeignKey(Musician, on_delete=models.CASCADE) name = models.CharField(max_length=100) release_date = models.DateField() num_stars = models.IntegerField()
- 因為我創建的項目用的是python的虛擬環境,virtualenv就是用來為一個應用創建一套「隔離」的Python運行環境。所以需要安裝一些環境的依賴
# 因為我現在的Django版本是3.x會出現一些版本不對應的情況,所以我將版本降到了2.1.7 ,沒有這個問題的需要此操作 $ pip3 install Django==2.1.7 # Successfully installed Django-2.1.7
# 安裝pymysql $ pip3 install pymysql # Successfully installed pymysql-0.9.3
- 在包含settings.py的目錄下的init.py文件中,將下面的程式碼放進去
import pymysql pymysql.install_as_MySQLdb()
- 先執行資料庫遷移的命令
manage.py makemigrations
,再執行建表的命令manage.py migrate
$ python3 manage.py makemigrations Migrations for 'signtest': signtest/migrations/0001_initial.py - Create model Album - Create model Musician - Add field artist to album
$ python3 manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions, signtest Running migrations: Applying contenttypes.0001_initial... OK # ... (venv) pengyapandeMacBook-Air:sangyu pengyapan$
- 進入資料庫查看

- 到這就裡就根據Django模型在資料庫建表成功了
- 其他的一些命令,可能用不到只是記錄下
# 卸載mysqlclient pip install mysqlclient # 異常:mysqlclient 1.3.13 or newer is required; you have 0.9.3 # 可能是由於Django版本不一致的問題改成,也可以通過修改/Users/lixiang/.env/lib/python3.6/site-packages/django/db/backends/mysql/base.py 這個文件下的注釋掉version < (1, 3, 13) # 這是在sql中執行的命令的,主要是記錄建表資訊會記錄在這個表django_migrations中 DELETE FROM django_migrations WHERE app='your-app-name'; # 下載依賴時增加版本資訊 mysql-connector-python==1.0.12 # 要為應用創建初始遷移,請運行makemigrations並指定應用名稱。將創建遷移文件夾 ./manage.py makemigrations <myapp>