TECH I.S.

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()

ご覧のとおり、phonejoined_dateをMember Modelに追加したいと考えています。

これはモデルの構造の変更のため、移行をして、データベースを更新する必要があることを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ファイルを再度作成し、2つの新しいフィールドに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\<em>Your Name</em>\myworld\my_tennis_club>

データの挿入

データの更新の章で行ったのと同じアプローチで、2つの新しいフィールドにデータを挿入できます。

まず、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()

これにより、メンバーモデルに電話番号と日付が挿入されます。少なくとも最初のレコードについては、残りの4つのレコードは空のままになります。それらについては、チュートリアルの後半で扱います。

次のコマンドを実行して、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}]>


プログラミング学習を加速させる

プログラミングをプロの講師に教えてもらいませんか。

テックアイエスのプログラミングスクールは初心者も大歓迎です。年齢制限もありません。転職・副業に強く、挫折させない手厚いサポートで稼ぐ力を身につけましょう!

スクールの詳細