Python | Django | モデルにおけるメタオプションの使い方
公開日: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"という名のテーブルが以下のように追加されていることが分かる.
以上