diadia

興味があることをやってみる。自分のメモを残しておきます。

class Meta について

一体何なのか

Metaを使う場面

よく分からずMetaを使っていた。というかコードをコピペしてた。これはなんなのか? 自分が使う場面は、form関係ではModelFormの継承時に使う。こんな感じで。

from django import forms

class MessageForm(forms.ModelForm):
    class Meta:
        model = Message
        fields = ["your_name","your_email","message"]

ドキュメント:https://docs.djangoproject.com/ja/2.1/ref/models/options/

少しわかった

抽象基底クラスは、複数の他モデルに対して共通の情報を入れ込みたいときに有用です。基底クラスを書いて Meta クラス内で abstract=True をセットしてください。これで、このモデルはデータベーステーブルを作成するために使用されることはなくなります。 代わりに、他のモデルで基底クラスとして使われる際に、これら子クラスのフィールドとして追加されます。

何が言いたいのか?

これはおそらく以下のようなものだろう。まずMetaを自作したクラス内で記述する場合には、そのクラス自身をテーブルとして利用する意図がない。テーブルとして利用せず、このクラスを継承した子クラスにフィールドとして利用することを考えている。そのためMetaを書くことで、python manage.py makemigrations, python manage.py migrateの影響を受けなくできる。影響を受けていては使わないテーブルが量産されて邪魔になってしまう。こんなところか。また分かり次第この記事を書き換える。

Metaを使っている例

例えば、django提供のユーザーモデルにはMetaが使われている。
django.contrib.auth.models.UserはAbstractUserとAbstractBaseUserとPermissionsMixinで構成されている。makemigrationsをしても、Metaの記述がなければ、AdminにはAbstractUserとAbstractBaseUserとPermissionsMixinが表示されてしまうことになるだろう。それはそれはとてもうざいことでしょう。 Userモデル関連のソースコードhttp://torajirousan.hatenadiary.jp/entry/2019/02/06/144704