Django – 模型層以及如何通過模型層來建表

  • 2020 年 3 月 27 日
  • 筆記

模型

Django 提供了一個抽象的模型 ("models") 層,

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

程式碼實例

  1. 當前項目的目錄結構
  1. 包含models.py 所在目錄名稱為:signtest,將它添加到settings.py
  1. 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'  # 資料庫名字      }  }
  1. 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()
  1. 因為我創建的項目用的是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
  1. 在包含settings.py的目錄下的init.py文件中,將下面的程式碼放進去
import pymysql  pymysql.install_as_MySQLdb()
  1. 先執行資料庫遷移的命令 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$ 
  1. 進入資料庫查看
  1. 到這就裡就根據Django模型在資料庫建表成功了
  2. 其他的一些命令,可能用不到只是記錄下
# 卸載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>