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) 现在提供一次性默认值(将在所有现有行上设置,该列的 null 值为该值)
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 字段
运行迁移命令
py manage.py migrate
这将导致以下输出
要执行的操作
应用所有迁移:admin、auth、contenttypes、members、sessions
运行迁移
应用 members.0002_member_joined_date_member_phone... 确定
(myworld) C:\Users\您的姓名\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}]>