Django 更新模型
在模型中新增欄位
要在表建立後向其新增欄位,請開啟 models.py
檔案,並進行更改。
my_tennis_club/members/models.py
:
from django.db import models
class Member(models.Model):
firstname = models.CharField(max_length=255)
lastname = models.CharField(max_length=255)
phone = models.IntegerField()
joined_date = models.DateField()
如您所見,我們想向我們的 Member 模型新增 phone
和 joined_date
。
這是模型結構的更改,因此我們必須進行遷移,告訴 Django 它需要更新資料庫。
py manage.py makemigrations members
在我的情況下,這將導致一個提示,因為我試圖向一個已經包含記錄的表中新增不允許為空的欄位。
如您所見,Django 詢問我是要為這些欄位提供一個特定的值,還是要停止遷移並在模型中修復它。
py manage.py makemigrations members
您正在嘗試向 members 新增一個非空欄位 'joined_date' 而沒有預設值;我們不能這樣做(資料庫需要一些東西來填充現有行)。
請選擇一個解決方案:
1) 現在提供一個一次性預設值(將設定在所有現有行中此列為空值的行上)
2) 退出,讓我在 models.py 中新增一個預設值
選擇一個選項:
我將選擇選項 2,並再次開啟 models.py
檔案,併為這兩個新欄位允許 NULL 值。
my_tennis_club/members/models.py
:
from django.db import models
class Member(models.Model):
firstname = models.CharField(max_length=255)
lastname = models.CharField(max_length=255)
phone = models.IntegerField(null=True)
joined_date = models.DateField(null=True)
然後再次進行遷移。
py manage.py makemigrations members
這將產生以下結果:
members 的遷移:
members\migrations\0002_member_joined_date_member_phone.py
- 向 member 新增欄位 joined_date
- 向 member 新增欄位 phone
執行 migrate 命令:
py manage.py migrate
這將產生以下輸出:
要執行的操作
應用所有遷移:admin, auth, contenttypes, members, sessions
正在執行遷移
應用 members.0002_member_joined_date_member_phone... OK
(myworld) C:\Users\Your Name\myworld\my_tennis_club>
插入資料
我們可以使用與更新資料章節中相同的方法向這兩個新欄位插入資料。
首先我們進入 Python Shell:
py manage.py shell
現在我們進入了 shell,結果應該類似於這樣:
Python 3.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, 13:44:55) [MSC v.1928 64 bit (AMD64)] on win32
鍵入 "help"、"copyright"、"credits" 或 "license" 以獲取更多資訊。
(InteractiveConsole)
>>>
在底部的三個 >>>
之後,輸入以下內容(每行輸入後按 [enter]):
>>> from members.models import Member
>>> x = Member.objects.all()[0]
>>> x.phone = 5551234
>>> x.joined_date = '2022-01-05'
>>> x.save()
這將在 Member 模型中插入一個電話號碼和一個日期,至少對於第一條記錄是這樣,其餘四條記錄暫時留空。我們將在本教程的後面處理它們。
執行此命令以檢視 Member 表是否已更新:
>>> Member.objects.all().values()
結果應該看起來像這樣
<QuerySet [
{'id': 1, 'firstname': 'Emil', 'lastname': 'Refsnes', 'phone': 5551234, 'joined_date': datetime.date(2022, 1, 5)},
{'id': 2, 'firstname': 'Tobias', 'lastname': 'Refsnes', 'phone': None, 'joined_date': None},
{'id': 3, 'firstname': 'Linus', 'lastname': 'Refsnes', 'phone': None, 'joined_date': None},
{'id': 4, 'firstname': 'Lene', 'lastname': 'Refsnes', 'phone': None, 'joined_date': None},
{'id': 5, 'firstname': 'Stalikken', 'lastname': 'Refsnes', 'phone': None, 'joined_date': None}]>