モデルの Meta オプションLink to this heading
このドキュメントでは、モデル内部の class Meta 内でモデルに与えられる、すべての可能な メタデータオプション を説明します。
利用可能な Meta オプションLink to this heading
abstractLink to this heading
- Options.abstractLink to this definition
abstract = Trueの場合、このモデルは 抽象基底クラス になります。
app_labelLink to this heading
- Options.app_labelLink to this definition
モデルが
INSTALLED_APPSでアプリケーションの外部で定義されている場合、どのアプリケーションに属するかを宣言する必要があります:app_label = "myapp"モデルを
app_label.object_nameまたはapp_label.model_nameという形式で表現したい場合は、それぞれmodel._meta.labelまたはmodel._meta.label_lowerを使用します。
base_manager_nameLink to this heading
- Options.base_manager_nameLink to this definition
モデルの
_base_managerに使用するマネージャの属性名、例えば'objects'です。
db_tableLink to this heading
- Options.db_tableLink to this definition
モデルに使用するデータベーステーブルの名前:
db_table = "music_album"
テーブル名Link to this heading
手間を省くために、Django はモデルクラスとそれを含むアプリの名前から、データベーステーブルの名前を自動的に生成します。モデルのデータベーステーブル名は、モデルの "app label" (manage.py startapp で使った名前) とモデルのクラス名をアンダースコアでつないで作ります。
例えば、アプリ bookstore (manage.py startapp bookstore で作成) がある場合、class Book として定義されたモデルは bookstore_book という名前のデータベーステーブルを持ちます。
データベーステーブル名を上書きするには、 class Meta の db_table パラメータを使用します。
データベースのテーブル名が SQL の予約語だったり、 Python の変数名では許されない文字(特にハイフン)を含んでいたりしても大丈夫です。Django は裏でカラム名とテーブル名をクォート処理します。
db_table_commentLink to this heading
- Options.db_table_commentLink to this definition
このモデルに使うデータベーステーブルのコメントです。あなたの Django コードを見ていない、直接データベースにアクセスできる人のために、 データベーステーブルをドキュメント化するのに便利です。たとえば以下のようにします:
class Answer(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
answer = models.TextField()
class Meta:
db_table_comment = "Question answers"
db_tablespaceLink to this heading
- Options.db_tablespaceLink to this definition
このモデルに使用する データベーステーブル空間 の名前です。デフォルトはプロジェクトの
DEFAULT_TABLESPACE設定です。バックエンドがテーブル空間をサポートしていない場合、このオプションは無視されます。
default_manager_nameLink to this heading
- Options.default_manager_nameLink to this definition
モデルの
_default_managerに使用するマネージャの名前。
get_latest_byLink to this heading
- Options.get_latest_byLink to this definition
モデル内のフィールド名またはフィールド名のリスト。通常は
DateField,DateTimeField,IntegerFieldです。これはモデルManagerのlatest()とearliest()メソッドで使用するデフォルトのフィールドを指定します。実装例:
# Latest by ascending order_date. get_latest_by = "order_date" # Latest by priority descending, order_date ascending. get_latest_by = ["-priority", "order_date"]詳しくは
latest()のドキュメントを参照してください。
managedLink to this heading
- Options.managedLink to this definition
デフォルトは
Trueです。つまり、 Django はmigrateやマイグレーションの一部として適切なデータベーステーブルを作成し、flush管理コマンドの一部として削除します。つまり、 Django はデータベーステーブルのライフサイクルを 管理 します。Falseの場合、このモデルに対してデータベーステーブルの作成、変更、削除の操作を行いません。これは、モデルが既存のテーブルや他の方法で作成されたデータベースビューを表す場合に便利です。これはmanaged=Falseの場合の 唯一の 違いです。モデルの処理に関する他のすべての側面は、通常とまったく同じです。これには以下が含まれます。Adding an automatic primary key field to the model if you don't declare it. To avoid confusion for later code readers, it's recommended to specify all the columns from the database table you are modeling when using unmanaged models.
managed=FalseのモデルがManyToManyFieldを含み、それが別の管理対象外モデルを指している場合、多対多の結合のための中間テーブルも作成されません。しかし、1つの管理モデルと1つの管理対象外モデル間の中間テーブルは 作成 されます。このデフォルトの動作を変更する必要がある場合は、(
managedを必要に応じて設定した) 明示的なモデルとして中間テーブルを作成し、ManyToManyField.through属性を使用してカスタムモデルとのリレーションを作成します。
managed=Falseのモデルを含むテストでは、テストのセットアップの一部として正しいテーブルが作成されるようにする必要があります。モデルクラスの Python レベルでの動作を変更したい場合、
managed=Falseを使って既存のモデルのコピーを作成することもできます。しかし、その場合はもっと良い方法があります。 プロキシモデル です。
order_with_respect_toLink to this heading
- Options.order_with_respect_toLink to this definition
このオブジェクトを指定されたフィールドに対してソート可能にします。通常は
ForeignKeyです。これは、リレーション先オブジェクトを親オブジェクトに対してソート可能にするために使用できます。例えば、AnswerとQuestionオブジェクトにリレーションがあり、質問には複数の答えがあり、答えの順番が重要である場合、次のようにします:from django.db import models class Question(models.Model): text = models.TextField() # ... class Answer(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) # ... class Meta: order_with_respect_to = "question"order_with_respect_toが指定されている場合、リレーション先オブジェクトの順序を取得・設定するための2つのメソッドが追加されます。get_RELATED_order()とset_RELATED_order()で、RELATEDは小文字のモデル名です。たとえば、あるQuestionオブジェクトが複数のAnswerオブジェクトにリレーションしているとすると、返されるリストにはリレーション先のAnswerオブジェクトの主キーが含まれます:>>> question = Question.objects.get(id=1) >>> question.get_answer_order() [1, 2, 3]Questionオブジェクトのリレーション先の
Answerオブジェクトの順番は、Answerの主キーのリストを渡すことで設定できます:>>> question.set_answer_order([3, 1, 2])リレーション先オブジェクトには
get_next_in_order()とget_previous_in_order()というメソッドもあり、これらのオブジェクトに適切な順番でアクセスできます。Answerオブジェクトがidで並べられていると仮定すると、下記のようになります:>>> answer = Answer.objects.get(id=2) >>> answer.get_next_in_order() <Answer: 3> >>> answer.get_previous_in_order() <Answer: 1>
orderingLink to this heading
- Options.orderingLink to this definition
オブジェクトのリストを取得するときに使用する、オブジェクトのデフォルトの順序:
ordering = ["-order_date"]これは文字列やクエリ式のタプルまたはリストです。各文字列はフィールド名で、オプションのプレフィックス "-" は降順を表します。先頭の "-" がないフィールドは昇順に並びます。ランダムに並び替えたい場合は、文字列 "?" を使用します。
例えば、
pub_dateフィールドで昇順にソートするには、次のようにします:ordering = ["pub_date"]pub_dateの降順でソートするには、次のようにします:ordering = ["-pub_date"]pub_dateの降順でソートし、authorの昇順でソートするには、次のようにします:ordering = ["-pub_date", "author"]クエリ式 を使うこともできます。
authorの昇順で並び替え、null値を最後にソートしたい場合、これを使います:from django.db.models import F ordering = [F("author").asc(nulls_last=True)]
permissionsLink to this heading
- Options.permissionsLink to this definition
このオブジェクトを作成するときに permissions テーブルに入力する追加のパーミッション。追加、変更、削除、表示のパーミッションはそれぞれのモデルに対して自動的に作成されます。この例では
can_deliver_pizzasという追加のパーミッションを指定しています:permissions = [("can_deliver_pizzas", "Can deliver pizzas")]これは
(permission_code, human_readable_permission_name)の形式の2値タプルのリストまたはタプルです。
default_permissionsLink to this heading
- Options.default_permissionsLink to this definition
デフォルトは
('add', 'change', 'delete', 'view')です。このリストはカスタマイズできます。例えば、アプリがデフォルトのパーミッションを必要としない場合は、空のリストを指定します。暗黙的にパーミッションが作成されるのを防ぐには、migrateによってモデルが作成される前に、モデルに指定する必要があります。
proxyLink to this heading
- Options.proxyLink to this definition
proxy = Trueの場合、他のモデルをサブクラス化したモデルは プロキシモデル として扱われます。
required_db_featuresLink to this heading
- Options.required_db_featuresLink to this definition
現在の接続が持つべきデータベースの機能のリストで、このリストに基づいてモデルがマイグレーションフェーズで考慮されます。たとえば、このリストを
['gis_enabled']に設定すると、そのモデルはGISが有効なデータベース上でのみ同期されます。これは、複数のデータベースバックエンドでテストする際に、一部のモデルをスキップするのにも便利です。作成されるかどうかわからないモデル間のリレーションは避けてください。ORMはこれを処理しません。
required_db_vendorLink to this heading
- Options.required_db_vendorLink to this definition
このモデルが特定する、サポートされているデータベース・ベンダーの名前。現在の組み込みベンダー名は
sqlite,postgresql,mysql,oracleです。この属性が空ではなく、現在の接続ベンダーがこの属性と一致しない場合、モデルは同期されません。
select_on_saveLink to this heading
- Options.select_on_saveLink to this definition
Determines if Django will use the pre-1.6
django.db.models.Model.save()algorithm. The old algorithm usesSELECTto determine if there is an existing row to be updated. The new algorithm tries anUPDATEdirectly. In some rare cases theUPDATEof an existing row isn't visible to Django. An example is the PostgreSQLON UPDATEtrigger which returnsNULL. In such cases the new algorithm will end up doing anINSERTeven when a row exists in the database.通常、この属性を設定する必要はありません。デフォルトは
Falseです。See
django.db.models.Model.save()for more about the old and new saving algorithm.
indexesLink to this heading
- Options.indexesLink to this definition
モデルに定義したい インデックス のリストです:
from django.db import models class Customer(models.Model): first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) class Meta: indexes = [ models.Index(fields=["last_name", "first_name"]), models.Index(fields=["first_name"], name="first_name_idx"), ]
unique_togetherLink to this heading
- Options.unique_togetherLink to this definition
-
組み合わせが一意でなければならないフィールドのリストを指定します。
unique_together = [["driver", "restaurant"]]これは、一緒に考えたときに一意でなければならないリストのリストです。Django の管理画面で使われ、データベースレベルで強制されます (つまり、
CREATE TABLEステートメントに適切なUNIQUEステートメントが含まれます)。利便性のために、
unique_togetherは1つのフィールドセットしかないときは1つのリストにできます:unique_together = ["driver", "restaurant"]ManyToManyFieldをunique_togetherに含めることはできません(それが何を意味するのかさえ不明です!)。ManyToManyFieldに関連する一意性を検証する必要がある場合は、シグナルを使うか、明示的なthroughモデルを使用してみてください。制約に違反したときにモデル検証中に発生する
ValidationErrorはunique_togetherエラーコードを持ちます。
constraintsLink to this heading
- Options.constraintsLink to this definition
モデルに定義したい 制約 のリスト:
from django.db import models class Customer(models.Model): age = models.IntegerField() class Meta: constraints = [ models.CheckConstraint(condition=models.Q(age__gte=18), name="age_gte_18"), ]
verbose_nameLink to this heading
- Options.verbose_nameLink to this definition
人間が読めるオブジェクトの名前(単数形):
verbose_name = "pizza"指定されない場合、 Django はクラス名を小文字にして使います。
CamelCaseはcamel caseになります。
verbose_name_pluralLink to this heading
- Options.verbose_name_pluralLink to this definition
オブジェクトの名前の複数形:
verbose_name_plural = "stories"指定されない場合、 Django は
verbose_name+"s"を使用します。
読み取り専用の Meta 属性Link to this heading
labelLink to this heading
- Options.labelLink to this definition
オブジェクトの表現。
app_label.object_nameを返します。例:'polls.Question'
label_lowerLink to this heading
- Options.label_lowerLink to this definition
モデルの表現。
app_label.model_name'を返します。例:'polls.question'