モデルMetaオプション
このドキュメントでは、モデルを内部class Meta
で指定できるすべての可能なメタデータオプションについて説明します。
利用可能なMetaオプション
app_label
- Options.app_label
モデルが:setting: `INSTALLED_APPS` でアプリケーションの外部で定義されている場合、モデルはどのアプリに属するかを宣言する必要があります。
app_label = 'myapp'
モデルを
app_label.object_name
またはapp_label.model_name
の形式で表現する場合は、それぞれmodel._meta.label
またはmodel._meta.label_lower
を使用できます。
db_table
- Options.db_table
モデルに使用するデータベーステーブルの名前:
db_table = 'music_album'
テーブル名
時間を節約するために、Djangoはモデルクラスとそれを含むアプリの名前からデータベーステーブルの名前を自動的に取得します。 モデルのデータベーステーブル名は、モデルの「アプリラベル」(で使用した名前)を結合することによって作成されます :djadmin: `manage.py startapp ` –モデルのクラス名にアンダースコアを付けます。
たとえば、アプリbookstore
(manage.py startapp bookstore
によって作成されたもの)がある場合、class Book
として定義されたモデルには、bookstore_book
という名前のデータベーステーブルがあります。
データベーステーブル名を上書きするには、class Meta
のdb_table
パラメーターを使用します。
データベースのテーブル名がSQLの予約語である場合、またはPython変数名で許可されていない文字(特にハイフン)が含まれている場合は問題ありません。 Djangoは、舞台裏で列とテーブルの名前を引用しています。
MariaDBとMySQLには小文字のテーブル名を使用します
db_table
を介してテーブル名をオーバーライドする場合、特にMySQLバックエンドを使用している場合は、小文字のテーブル名を使用することを強くお勧めします。 詳細については、 MySQLノートを参照してください。
Oracleのテーブル名の引用
Oracleがテーブル名に持つ30文字の制限を満たし、Oracleデータベースの通常の規則に一致させるために、Djangoはテーブル名を短縮してすべて大文字にする場合があります。 このような変換を防ぐには、db_table
の値として引用符で囲まれた名前を使用します。
db_table = '"name_left_in_lowercase"'
このような引用符で囲まれた名前は、Djangoの他のサポートされているデータベースバックエンドでも使用できます。 ただし、Oracleを除いて、引用符は効果がありません。 詳細については、 Oracleノートを参照してください。
db_tablespace
- Options.db_tablespace
- このモデルに使用するデータベーステーブルスペースの名前。 デフォルトは、プロジェクトの:setting: `DEFAULT_TABLESPACE` 設定(設定されている場合)です。 バックエンドがテーブルスペースをサポートしていない場合、このオプションは無視されます。
get_latest_by
- Options.get_latest_by
モデル内のフィールドの名前またはフィールド名のリスト。通常は DateField 、 DateTimeField 、または IntegerField です。 これは、モデルの Manager の latest()および Early()メソッドで使用するデフォルトのフィールドを指定します。
例:
# Latest by ascending order_date. get_latest_by = "order_date" # Latest by priority descending, order_date ascending. get_latest_by = ['-priority', 'order_date']
詳細については、 latest()のドキュメントを参照してください。
managed
- Options.managed
デフォルトは
True
です。これは、Djangoが:djadmin: `migrate` に、または移行の一部として適切なデータベーステーブルを作成し、:djadmin:` flushの一部として削除することを意味します。 `管理コマンド。 つまり、Djangoはデータベーステーブルのライフサイクルを管理します。False
の場合、このモデルに対してデータベーステーブルの作成、変更、または削除操作は実行されません。 これは、モデルが他の方法で作成された既存のテーブルまたはデータベースビューを表す場合に役立ちます。 これは、managed=False
の場合ののみの違いです。 モデル処理の他のすべての側面は、通常とまったく同じです。 これも宣言しない場合は、モデルに自動主キーフィールドを追加します。 後のコードリーダーの混乱を避けるために、アンマネージモデルを使用する場合は、モデル化するデータベーステーブルのすべての列を指定することをお勧めします。
managed=False
のモデルに、別のアンマネージモデルを指す ManyToManyField が含まれている場合、多対多結合の中間テーブルも作成されません。 ただし、1つのマネージドモデルと1つのアンマネージドモデルの間の中間テーブルが作成されます。このデフォルトの動作を変更する必要がある場合は、中間テーブルを明示的なモデルとして作成し(
managed
を必要に応じて設定)、 ManyToManyField.through 属性を使用してリレーションにカスタムモデルを使用させます。
managed=False
のモデルを含むテストの場合、テストセットアップの一部として正しいテーブルが作成されていることを確認するのはあなた次第です。モデルクラスのPythonレベルの動作を変更することに興味がある場合は、で
managed=False
を使用して、既存のモデルのコピーを作成できます。 ただし、そのような状況には、プロキシモデルというより良いアプローチがあります。
order_with_respect_to
- Options.order_with_respect_to
このオブジェクトを、指定されたフィールド(通常は
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
が設定されている場合、関連オブジェクトの取得と順序の設定を行うために、get_RELATED_order()
とset_RELATED_order()
の2つの追加メソッドが提供されます。ここで、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()
の2つのメソッドもあり、これらを使用してこれらのオブジェクトに適切な順序でアクセスできます。Answer
オブジェクトがid
によって順序付けられていると仮定します。>>> answer = Answer.objects.get(id=2) >>> answer.get_next_in_order() <Answer: 3> >>> answer.get_previous_in_order() <Answer: 1>
order_with_respect_to
は、ordering
オプションを暗黙的に設定します
内部的に、order_with_respect_to
は、_order
という名前のフィールド/データベース列を追加し、モデルの ordering オプションをこのフィールドに設定します。 したがって、order_with_respect_to
とordering
を一緒に使用することはできず、order_with_respect_to
によって追加された順序は、このモデルのオブジェクトのリストを取得するたびに適用されます。
order_with_respect_to
を変更する
order_with_respect_to
は新しいデータベース列を追加するため、最初の:djadmin: `migrate` の後にorder_with_respect_to
を追加または変更する場合は、必ず適切な移行を行って適用してください。
ordering
- Options.ordering
オブジェクトのリストを取得するときに使用する、オブジェクトのデフォルトの順序:
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)]
警告
注文は無料の操作ではありません。 注文に追加する各フィールドには、データベースにコストがかかります。 追加する各外部キーには、デフォルトの順序もすべて暗黙的に含まれます。
クエリに順序が指定されていない場合、結果はデータベースから指定されていない順序で返されます。 特定の順序付けは、結果内の各オブジェクトを一意に識別する一連のフィールドで順序付けする場合にのみ保証されます。 たとえば、name
フィールドが一意でない場合、それによる順序付けでは、同じ名前のオブジェクトが常に同じ順序で表示されるとは限りません。
permissions
- Options.permissions
このオブジェクトを作成するときにアクセス許可テーブルに入力する追加のアクセス許可。 モデルごとに、追加、変更、削除、および表示のアクセス許可が自動的に作成されます。 この例では、追加のアクセス許可
can_deliver_pizzas
を指定しています。permissions = [('can_deliver_pizzas', 'Can deliver pizzas')]
これは、
(permission_code, human_readable_permission_name)
形式の2タプルのリストまたはタプルです。
default_permissions
- Options.default_permissions
- デフォルトは
('add', 'change', 'delete', 'view')
です。 たとえば、アプリがデフォルトの権限を必要としない場合は、これを空のリストに設定することで、このリストをカスタマイズできます。 省略された権限が作成されないようにするには、:djadmin: `migrate` でモデルを作成する前に、モデルで指定する必要があります。
required_db_features
- Options.required_db_features
- 移行フェーズでモデルが考慮されるように、現在の接続に必要なデータベース機能のリスト。 たとえば、このリストを
['gis_enabled']
に設定すると、モデルはGIS対応データベースでのみ同期されます。 複数のデータベースバックエンドでテストする場合は、一部のモデルをスキップすることも役立ちます。 ORMはこれを処理しないため、作成される場合と作成されない場合があるモデル間の関係は避けてください。
required_db_vendor
- Options.required_db_vendor
- このモデルが固有の、サポートされているデータベースベンダーの名前。 現在の組み込みベンダー名は、
sqlite
、postgresql
、mysql
、oracle
です。 この属性が空でなく、現在の接続ベンダーがそれと一致しない場合、モデルは同期されません。
select_on_save
- Options.select_on_save
Djangoが1.6より前の django.db.models.Model.save()アルゴリズムを使用するかどうかを決定します。 古いアルゴリズムは、
SELECT
を使用して、更新する既存の行があるかどうかを判別します。 新しいアルゴリズムは、UPDATE
を直接試行します。 まれに、既存の行のUPDATE
がDjangoに表示されない場合があります。 例として、NULL
を返すPostgreSQLON UPDATE
トリガーがあります。 このような場合、データベースに行が存在する場合でも、新しいアルゴリズムはINSERT
を実行することになります。通常、この属性を設定する必要はありません。 デフォルトは
False
です。新旧の保存アルゴリズムの詳細については、 django.db.models.Model.save()を参照してください。
indexes
- Options.indexes
モデルで定義するインデックスのリスト:
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_together
- Options.unique_together
一緒になって一意でなければならないフィールド名のセット:
unique_together = [[../'driver', 'restaurant']]
これは、一緒に検討するときに一意でなければならないリストのリストです。 これはDjango管理者で使用され、データベースレベルで適用されます(つまり、適切な
UNIQUE
ステートメントがCREATE TABLE
ステートメントに含まれています)。便宜上、
unique_together
は、単一のフィールドセットを処理するときに単一のリストにすることができます。unique_together = ['driver', 'restaurant']
ManyToManyField をunique_togetherに含めることはできません。 (それが何を意味するのかは明確ではありません!) ManyToManyField に関連する一意性を検証する必要がある場合は、シグナルまたは明示的なからモデルを使用してみてください。
制約に違反したときにモデルの検証中に発生した
ValidationError
には、unique_together
エラーコードがあります。
index_together
- Options.index_together
一緒になってインデックスが付けられるフィールド名のセット:
index_together = [ ["pub_date", "deadline"], ]
このフィールドのリストは一緒にインデックス付けされます(つまり 適切な
CREATE INDEX
ステートメントが発行されます。)便宜上、
index_together
は、単一のフィールドセットを処理するときに単一のリストにすることができます。index_together = ["pub_date", "deadline"]
constraints
- Options.constraints
モデルで定義する制約のリスト:
from django.db import models class Customer(models.Model): age = models.IntegerField() class Meta: constraints = [ models.CheckConstraint(check=models.Q(age__gte=18), name='age_gte_18'), ]
verbose_name
- Options.verbose_name
オブジェクトの人間が読める名前、単数:
verbose_name = "pizza"
これが指定されていない場合、Djangoはクラス名の変更されたバージョンを使用します。
CamelCase
はcamel case
になります。
verbose_name_plural
- Options.verbose_name_plural
オブジェクトの複数形:
verbose_name_plural = "stories"
これが指定されていない場合、Djangoは verbose_name +
"s"
を使用します。
読み取り専用Meta属性
label
- Options.label
- オブジェクトの表現は、
app_label.object_name
を返します。例:'polls.Question'
。
label_lower
- Options.label_lower
- モデルの表現は、
app_label.model_name
を返します。例:'polls.question'
。