Python | Django | モデルにおけるメタオプションの使い方

2021年6月28日

公開日:2021/6/28

Pythonには,DjangoというWebアプリケーションフレームワークがある.フレームワークのため,Djangoを利用するとWebアプリを通常よりも短時間で開発することが可能になる.

前記事にて,「モデルフィールドリファレンスの使い方」を記した.前記事での設定をそのまま引き継いだ上で,本記事では,「モデルにおけるメタオプションの使い方」を記す.

◆実施環境

Python 3.8.8
Django 3.2.3

■モデルにおけるメタオプションの使い方

ターミナルを開き,”conda activate 仮想環境名”を実行し,仮想環境に移行する.”model_project”のディレクトリで”python manage.py migrate model_app zero”を実行する.実行するとターミナルに以下が出力される."model_app/migrations/0001_add_cake.py"が適用から外れる.

Operations to perform:
  Unapply all migrations: model_app
Running migrations:
  Rendering model states... DONE
  Unapplying model_app.0001_add_cake... OK

以下赤枠の"model_app/migrations/0001_add_cake.py"を削除する.

“model_project/models.py"に以下(1)~(3)を追記する.

(1) タイムゾーン(timezone)を利用:現在時刻などを利用可能
(2) 抽象基底クラスを利用:複数のモデル定義に"create_date"(作成日)と"update_date"(更新日)を含めることができる.
(3) メタオプション(Meta options)の利用:
・db_table: データベーステーブルの名前を付与する
・index_together: フィールド名を2つセットにしてindexとする
・ordering: オブジェクトにおける順番を決める

“model_project/models.py"の全体内容は以下のように編集する.

from django.db import models
from django.utils import timezone # (1)タイムゾーンを利用

class Date(models.Model): # (2)抽象基底クラスを利用
  create_date = models.DateTimeField(default=timezone.now) # (1)(2)
  update_date = models.DateTimeField(default=timezone.now) # (1)(2)

  class Meta: # (2)
    abstract = True # (2)

class Cake(Date):
  cake_name = models.CharField(max_length=40)
  birthplace = models.CharField(max_length=40)
  birthday = models.DateField(default='1900-01-01')
  inventor = models.CharField(max_length=40)
  sales_amounts = models.IntegerField()
  like = models.BooleanField(default=True)
  email = models.EmailField(db_index=True)
  web_site = models.URLField()
  feed_back = models.TextField(null=True,blank=True)

  class Meta: # (3) Metaを利用
    db_table = 'cake' # (3) Meta(db_table)
    index_together = [['cake_name','inventor']] # (3) Meta(together)
    ordering = ['birthday'] # (3) Meta(ordering)

ターミナルを開き,”conda activate 仮想環境名”を実行し,仮想環境に移行する.”model_project”のディレクトリで”python manage.py makemigrations model_app –name add_cake”を実行する.実行するとターミナルに以下が出力される.

Migrations for 'model_app':
  model_app\migrations\0001_add_cake.py
    - Create model Cake

同時に"model_project/model_app/migrations"に"0001_add_cake.py"が作成される.

“model_project/model_app/migrations/0001_add_cake.py"の内容を確認すると,以下のように"fields"の内容に,抽象基底クラスの"create_date"と"update_date"が含まれていることが分かる.カラムの順番を変更する場合には,ここで操作をする必要がある.

operations = [
  migrations.CreateModel(
    name='Cake',
    fields=[
      ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
      ('create_date', models.DateTimeField(default=django.utils.timezone.now)), # 抽象基底クラス
      ('update_date', models.DateTimeField(default=django.utils.timezone.now)), # 抽象基底クラス
      ('cake_name', models.CharField(max_length=40)),
      ('birthplace', models.CharField(max_length=40)),
      ('birthday', models.DateField(default='1900-01-01')),
      ('inventor', models.CharField(max_length=40)),
      ('sales_amounts', models.IntegerField()),
      ('like', models.BooleanField(default=True)),
      ('email', models.EmailField(db_index=True, max_length=254)),
      ('web_site', models.URLField()),
      ('feed_back', models.TextField(blank=True, null=True)),
    ],
    options={
      'db_table': 'cake',
      'ordering': ['birthday'],
      'index_together': {('cake_name', 'inventor')},
    },
  ),
]

ターミナルを開き,”conda activate 仮想環境名”の元,”model_project”のディレクトリで”python manage.py migrate model_app”を実行する.実行するとターミナルに以下が出力される.

Operations to perform:
  Apply all migrations: model_app
Running migrations:
  Applying model_app.0001_add_cake... OK

VS Codeの”View”をクリックし,以下”Command Palette”をクリックする.

“SQLite”を検索し,以下”SQLite: Open Database”を選ぶ.

その後,”db.sqlite3″を選ぶ.

“VS Code”に以下”SQLITE EXPLORER”が追加される.

”SQLITE EXPLORER”を開くと,"cake"という名のテーブルが以下のように追加されていることが分かる.

以上