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 更新数据库。

python manage.py makemigrations members

注意:请确保在运行命令前已返回虚拟环境。

上面的命令会弹出提示,因为我们尝试向一个已包含记录的表中添加不允许为空的字段。

如您所见,Django 会询问我们是否要为这些字段指定特定值,或者是否要停止迁移并在模型中修复它:

python manage.py makemigrations members
You are trying to add a non-nullable field 'joined_date' to members without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option:

我将选择选项 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)

然后再次执行迁移:

python manage.py makemigrations members

这将导致以下结果:

Migrations for 'members':
  members\migrations\0002_member_joined_date_member_phone.py
    - Add field joined_date to member
    - Add field phone to member

运行 migrate 迁移命令:

python manage.py migrate

这将导致以下输出:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, members, sessions
Running migrations:
  Applying members.0002_member_joined_date_member_phone... OK

(myworld) C:\Users\Your Name\myworld\my_tennis_club>

插入数据

我们可以用与更新数据章节中相同的方法,向这两个新字段插入数据:

首先,我们进入 Python Shell:

python manage.py shell

现在我们进入了 shell,结果应该类似于这样:

Python 3.13.2 (tags/v3.13.2:4f8bb39, Feb 4 2025, 15:23:48) [MSC v.1942 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

在底部,在三个 >>> 之后,输入以下内容(每行输入一行后按 [回车] 键):

>>> from members.models import Member
>>> x = Member.objects.all()[0]
>>> x.phone = 5551234
>>> x.joined_date = '2022-01-05'
>>> x.save()

这将向会员模型中插入电话号码和日期,至少对于第一条记录而言是这样,其余四条记录暂时为空。我们将在本教程的后续部分处理它们。

执行以下命令以查看会员表是否已更新:

>>> 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}]>