Django – 更新模型



Django 的 ORM API 提供了對關係資料庫表中儲存的資料執行 CRUD 操作的有用功能。

create()、update()delete() 方法分別對已存在的表執行其各自的操作。但是,您通常需要更改模型結構本身,例如新增、刪除或更改模型的屬性。Django 的管理後臺可以幫助處理這些活動。

Django 的遷移系統

Django 有一個強大的遷移系統,用於處理更新模型的過程。

Django 透過遷移機制將您對模型所做的更改(新增欄位、刪除模型等)傳播到您的資料庫模式中。遷移相關的命令使用manage.py指令碼執行。

以下命令可用:

  • migrate − 負責應用和撤銷遷移。
  • makemigrations − 負責根據對模型所做的更改建立新的遷移。
  • sqlmigrate − 顯示遷移的 SQL 語句。
  • showmigrations − 列出專案的遷移及其狀態。

首次設定 Django 專案時,它會自動安裝某些應用。它們列在settings.py模組中的INSTALLED_APPS部分。

這些應用中的大多數用於管理後臺建立和管理使用者、組、授權等,以及與這些應用相關的資料儲存在其各自的表中。

我們需要第一次執行以下migrate 命令來建立 INSTALLED_APPS所需的表結構:

python manage.py migrate

執行上述命令將在應用包資料夾內建立一個名為migrations的包。所有後續的遷移指令碼都儲存在其中。

隨後,當您建立新應用(使用startapp 命令)時,您還需要將其新增到 INSTALLED_APPS 列表中。接下來,宣告新應用所需的模型。在這裡,您需要為新應用建立所需的資料庫表。

makemigrations 命令

讓我們在models.py模組中新增一個新模型,如下所示:

from django.db import models

# Create your models here.
class Dreamreal(models.Model):
   website = models.CharField(max_length=50)
   mail = models.CharField(max_length=50)
   name = models.CharField(max_length=50)
   phonenumber = models.IntegerField()

   def __str__(self):
      return "Website: {} Email: {} Name: {} Ph.: {}".format(self.website, self.mail, self.name, self.phonenumber)

   class Meta:
      db_table = "dreamreal"

要將新模型傳播到資料庫,請執行makemigrations 命令

python manage.py makemigrations

將在 migrations 資料夾中建立一個遷移指令碼0001_initial.py。它包含一個Migrations 類。最初使用的migrate 命令使用此指令碼在settings.py的 DATABASES 部分中配置的資料庫中建立一個新表:

Python manage.py migrate

最終,您決定新增一個名為Employee的新模型類,如下所示:

class Employee(models.Model):  
   eid = models.CharField(max_length=20)  
   ename = models.CharField(max_length=100)  
   eemail = models.EmailField()  
   econtact = models.CharField(max_length=15)  
   class Meta:  
      db_table = "employee"

當您再次執行makemigrations命令時,它將建立第二個遷移指令碼

D:\workspace\myproject> python manage.py makemigrations myapp
Migrations for 'myapp':
   myapp\migrations\0002_employee.py
   - Create model Employee

使用 migrate 命令應用新的遷移檔案0002_employee.py

D:\workspace\myproject> python manage.py migrate              
Operations to perform:
   Apply all migrations: admin, auth, contenttypes, myapp, sessions
Running migrations:
   Applying myapp.0002_employee... OK

如果檢查資料庫結構,您可以在其中找到employee 表

Django Update Model

如果您認為有必要更改任何模型的結構,則需要再次執行遷移。

我們刪除email 欄位並新增salary 欄位

class Employee(models.Model):  
   eid = models.CharField(max_length=20)  
   ename = models.CharField(max_length=100)    
   econtact = models.CharField(max_length=15)  
   salary = models.IntegerField()
   class Meta:  
      db_table = "employee"

再次執行makemigrations命令。

D:\workspace\myproject> python manage.py makemigrations myapp 
Migrations for 'myapp':
   myapp\migrations\0003_remove_employee_eemail_employee_salary.py
      - Remove field eemail from employee
      - Add field salary to employee

showmigrations 命令

showmigrations命令顯示到目前為止生成的遷移指令碼列表,已應用的遷移顯示“X”標記。

python manage.py showmigrations
myapp
   [X] 0001_initial
   [X] 0002_employee
   [ ] 0003_remove_employee_eemail_employee_salary

再次執行migrate 命令以對employee 表進行更改:

D:\workspace\myproject> python manage.py migrate
Operations to perform:
   Apply all migrations: admin, auth, contenttypes, myapp, sessions
Running migrations:
   Applying myapp.0003_remove_employee_eemail_employee_salary... OK

如何回滾更改?

如果您想回滾對employee 表的最近更改並恢復0002_mployee.py指令碼的狀態,

D:\workspace\myproject> python manage.py migrate myapp 0002_employee
Operations to perform:
   Target specific migration: 0002_employee, from myapp
Running migrations:
   Rendering model states... DONE
   Unapplying myapp.0003_remove_employee_eemail_employee_salary... OK

返回並更改結構以確認已恢復employee 表的結構。

廣告
© . All rights reserved.