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()
Як бачите, ми хочемо додати phone
і joined_date
до нашої моделі учасників.
Це зміна в структурі моделі, тому ми повинні виконати міграцію, щоб повідомити Django, що він має оновити базу даних:
py manage.py makemigrations members
У моєму випадку це призведе до підказки, оскільки я намагаюся додати поля, які не мають значення null, до таблиці, яка вже містить записи.
Як бачите, Django запитує, чи хочу я надати полям певне значення, чи я хочу зупинити міграцію та виправити це в моделі:
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:
Я виберу варіант 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
Що призведе до такого:
Migrations for 'members':
members\migrations\0002_member_joined_date_member_phone.py
- Add field joined_date to member
- Add field phone to member
Виконати команду міграції:
py 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>
Вставити дані
Ми можемо вставити дані до двох нових полів за допомогою того самого підходу, що й у розділі Django Оновлення даних:
Спочатку ми входимо в оболонку Python:
py manage.py shell
Тепер ми в оболонці, результат має бути приблизно таким:
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)
>>>
Унизу після трьох символів >>>
напишіть наступне (і натисніть [enter] для кожного рядка):
>>> 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}]>