DjangoのMetaクラスの使い方【ordering, db_table, verbose_name, etc】
- 作成日: 2021-02-24
- 更新日: 2023-12-24
- カテゴリ: Django
DjangoのMetaクラス
PythonのWebフレームワークであるDjango(ジャンゴ)では、モデルと言う抽象化されたクラスを使ってデータベースにテーブルを定義します。
このモデルはmodels.Model
を継承させたクラスとして作成しますが、このクラス内にはMeta(メタ)という内部クラスを配置することが出来ます。
モデルのクラス内にMetaクラスを定義することでDjangoのそのモデルの取り扱い方法を変更することが可能です。
また、モデルに限らずMetaクラスはフォームなどにも設定できます。
この記事ではこのMetaクラスの機能の一部について解説します。
具体的には↓を見ていきます。
- Metaクラスの概要
- Metaクラスの書き方
- orderingの書き方
- db_tableの書き方
- verbose_name, verbose_name_pluralの書き方
Metaクラスの概要
DjangoのMetaクラスはモデルのクラス内に配置されます。
そしてMetaクラスはDjangoのそのモデルへの取り扱い方法を変更することが可能です。
Metaクラス内に予約された属性を書き、値で初期化することで変更が機能します。
Djangoは内部的にこのMetaクラスを参照します。
そして属性と属性値を参照してそのモデルのオブジェクトの扱い方を変更したり、管理サイト上の表示を変えたりします。
このMetaクラスはいわゆるDjangoの「かゆいところ」に手が届くクラスで、これを使うことでDjangoをもっと便利に使うことが出来ます。
Metaクラスの書き方
Metaクラスは↓のように書きます。
from django.db import models
class Post(models.Model):
no = models.IntegerField()
name = models.CharField(max_length=128)
# ↓これ
class Meta:
pass
↑のようにMetaクラスはモデルのクラスの内部に書きます。
属性を何も書いていない場合はMetaクラスは何も作用しません。
Metaクラスを作用させるには予約された属性と属性値を書く必要があります。
予約された属性はたくさんありますが、その全容については↓のドキュメントをご覧ください。
この記事では↓の属性を取り上げています。
- ordering
- db_table
- verbose_name
orderingの書き方
Metaクラスのordering
属性はオブジェクトのデフォルトの並び方を変更するときに使います。
ordering
は例えば↓のように書きます。
from django.db import models
class Post(models.Model):
no = models.IntegerField()
name = models.CharField(max_length=128)
class Meta:
# 昇順
# ordering = ['no']
# 降順
ordering = ['-no']
Metaクラスの中にordering
を書き、その値をリストで初期化します。
リストの中には文字列でオーダーを書きます。
オーダーはフィールド名とハイフン(-
)の組み合わせで表されます。
たとえばno
フィールドの値でオブジェクトを並び変えたい場合は文字列no
を書きます。
そして昇順でソートしたい場合はハイフン無し、降順でソートしたい場合はハイフン有りで書きます。
ordering
を書くとオブジェクトの取得の時にその値でオブジェクトがソートされます。
たとえばordering = ['no']
の場合は↓のような出力になり、
>>> Post.objects.all()
<QuerySet [<Post: Post object (1)>, <Post: Post object (2)>, <Post: Post object (3)>]>
ordering = ['-no']
の場合は↓のようになります。
>>> Post.objects.all()
<QuerySet [<Post: Post object (3)>, <Post: Post object (2)>, <Post: Post object (1)>]>
db_tableの書き方
db_table
はモデルのデータベースにおけるテーブル名を変更します。
db_table
は↓のように使います。
from django.db import models
class Post(models.Model):
no = models.IntegerField()
name = models.CharField(max_length=128)
class Meta:
# テーブル名をmypostに変更
db_table = 'mypost'
↑のようにdb_table
を定義すると、モデルが参照するテーブル名が設定した値になります。
↑のように変更を加えた後にpython manage.py makemigrations
を実行すると、テーブル名を変更するマイグレーションファイルが作成されます。
そしてpython manage.py migrate
を実行するとテーブル名が変更されます。
db_table
を定義したらマイグレーションを忘れずに実行するようにしましょう。
verbose_name, verbose_name_pluralの書き方
verbose_name
とverbose_name_plural
は管理サイト上のモデルの表記方法を変更します。
これらの属性は↓のように使います。
from django.db import models
class Post(models.Model):
no = models.IntegerField()
name = models.CharField(max_length=128)
class Meta:
verbose_name = 'ポスト' # 単数形
verbose_name_plural = 'ポスト群' # 複数形
verbose_name
にはモデルの単数形の名称を指定します。
verbose_name_plural
にはモデルの複数形の名称を指定します。
この2つの属性を↑のように設定すると、管理サイト上のモデルの単数形の名称は「ポスト」になり複数形は「ポスト群」になります。
Djangoはこれらの属性を、モデルを管理サイト上で表示するときに参照します。
おわりに
今回はMetaクラスについて解説しました。
モデルを使っててかゆくなってきたらこのMetaクラスを思い出してみてください。
🦝 < かゆい所に手が届くメタくん