ユーニックス総合研究所

  • home
  • archives
  • django-meta

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_nameverbose_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クラスを思い出してみてください。

🦝 < かゆい所に手が届くメタくん