Mô hình cập nhật Django
Thêm trường trong mô hình
Để thêm một trường vào bảng sau khi nó được tạo, hãy mở tệp models.py
và thực hiện các thay đổi của bạn:
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()
Như bạn có thể thấy, chúng tôi muốn thêm phone
và joined_date
vào Mô hình thành viên của mình.
Đây là một sự thay đổi trong cấu trúc của Mô hình và do đó chúng tôi phải thực hiện di chuyển để thông báo cho Django rằng nó phải cập nhật cơ sở dữ liệu:
py manage.py makemigrations members
Trong trường hợp của tôi, điều này sẽ dẫn đến lời nhắc vì tôi cố gắng thêm các trường không được phép rỗng vào bảng đã chứa bản ghi.
Như bạn có thể thấy, Django hỏi liệu tôi có muốn cung cấp cho các trường một giá trị cụ thể hay tôi muốn dừng quá trình di chuyển và sửa nó trong mô hình:
py 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:
Tôi sẽ chọn tùy chọn 2 và mở lại tệp models.py
và cho phép giá trị NULL cho hai trường mới:
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)
Và thực hiện di chuyển một lần nữa:
py manage.py makemigrations members
Điều này sẽ dẫn đến điều này:
Migrations for 'members':
members\migrations\0002_member_joined_date_member_phone.py
- Add field
joined_date to member
- Add field
phone to member
Chạy lệnh di chuyển:
py manage.py migrate
Điều này sẽ dẫn đến kết quả đầu ra này:
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>
Chèn dữ liệu
Chúng ta có thể chèn dữ liệu vào hai trường mới với cách tiếp cận tương tự như chúng ta đã làm trong chương Cập nhật dữ liệu :
Đầu tiên chúng ta vào Python Shell:
py manage.py shell
Bây giờ chúng ta đang ở trong shell, kết quả sẽ giống như thế này:
Python 3.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, 13:44:55) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
Ở phía dưới, sau ba >>>
viết dòng sau (và nhấn [enter] cho mỗi dòng):
>>> from members.models import Member
>>> x = Member.objects.all()[0]
>>> x.phone = 5551234
>>> x.joined_date = '2022-01-05'
>>> x.save()
Thao tác này sẽ chèn số điện thoại và ngày tháng vào Mô hình Thành viên, ít nhất là đối với bản ghi đầu tiên, bốn bản ghi còn lại hiện sẽ được để trống. Chúng ta sẽ giải quyết chúng sau trong hướng dẫn.
Thực hiện lệnh này để xem bảng Thành viên đã được cập nhật chưa:
>>> Member.objects.all().values()
Kết quả sẽ như thế này:
<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}]>