# Django 5.2.8 ドキュメント

# モデル `_meta` API

class Options

モデルの `_meta` API は、Django ORM のコアにあります。これにより、ルックアップ、クエリ、フォーム、admin などのシステムの他のパーツは、各モデルの機能を理解できるようになります。API は、各モデルクラスの `_meta` 属性からアクセス可能で、`django.db.models.options.Options` オブジェクトのインスタンスとなっています。

提供されるメソッドと属性は次のことに利用できます。

- モデルのすべてのフィールドインスタンスを取得する

- モデルの単一のフィールドインスタンスを名前で取得する

- モデルの主キーを構成するすべてのフィールドを取得する

## フィールドアクセス API

### モデルの単一のフィールドインスタンスを名前で取得する

Options.get_field(field_name)

  与えられたフィールドの名前を持つフィールドインスタンスを返します。

  `field_name` には、モデル上のフィールド、抽象または継承モデル上のフィールド、そのモデルを指す他のモデル上に定義されたフィールドのいずれかの名前を指定できます。後者の場合、`field_name` は (優先順に) ユーザーが設定した `related_query_name`、ユーザーが設定した `related_name`、Django が自動生成した名前のいずれかになります。

  `隠しフィールド` は、名前では取得できません。

  与えられた名前のフィールドが見つからなかったときは、`FieldDoesNotExist` 例外が発生します。

      >>> from django.contrib.auth.models import User

      # A field on the model
      >>> User._meta.get_field("username")
      <django.db.models.fields.CharField: username>

      # A field from another model that has a relation with the current model
      >>> User._meta.get_field("logentry")
      <ManyToOneRel: admin.logentry>

      # A non existent field
      >>> User._meta.get_field("does_not_exist")
      Traceback (most recent call last):
          ...
      FieldDoesNotExist: User has no field named 'does_not_exist'

### モデルのすべてのフィールドインスタンスを取得する

Options.get_fields(include_parents=True, include_hidden=False)

  モデルに関連するフィールドのタプルを返します。`get_fields()` は、次のように2つの引数を受け取り、どのフィールドを返すのかを制御できます。

  `include_parents`

    デフォルトは `True`。親クラスで定義されたフィールドを再帰的に含めます。`False` に設定した場合、`get_fields()` は現在のモデル上で直接宣言されたフィールドだけを検索します。抽象モデルまたはプロキシークラスから直接継承したモデルからのフィールドは、親ではなくローカルなものとみなされます。

  `include_hidden`

    デフォルトでは `False` です。 `True` に設定すると、 `get_fields()` は `隠しフィールド` を含みます。

      >>> from django.contrib.auth.models import User
      >>> User._meta.get_fields()
      (<ManyToOneRel: admin.logentry>,
       <django.db.models.fields.AutoField: id>,
       <django.db.models.fields.CharField: password>,
       <django.db.models.fields.DateTimeField: last_login>,
       <django.db.models.fields.BooleanField: is_superuser>,
       <django.db.models.fields.CharField: username>,
       <django.db.models.fields.CharField: first_name>,
       <django.db.models.fields.CharField: last_name>,
       <django.db.models.fields.EmailField: email>,
       <django.db.models.fields.BooleanField: is_staff>,
       <django.db.models.fields.BooleanField: is_active>,
       <django.db.models.fields.DateTimeField: date_joined>,
       <django.db.models.fields.related.ManyToManyField: groups>,
       <django.db.models.fields.related.ManyToManyField: user_permissions>)

      # Also include hidden fields.
      >>> User._meta.get_fields(include_hidden=True)
      (<ManyToOneRel: auth.user_groups>,
       <ManyToOneRel: auth.user_user_permissions>,
       <ManyToOneRel: admin.logentry>,
       <django.db.models.fields.AutoField: id>,
       <django.db.models.fields.CharField: password>,
       <django.db.models.fields.DateTimeField: last_login>,
       <django.db.models.fields.BooleanField: is_superuser>,
       <django.db.models.fields.CharField: username>,
       <django.db.models.fields.CharField: first_name>,
       <django.db.models.fields.CharField: last_name>,
       <django.db.models.fields.EmailField: email>,
       <django.db.models.fields.BooleanField: is_staff>,
       <django.db.models.fields.BooleanField: is_active>,
       <django.db.models.fields.DateTimeField: date_joined>,
       <django.db.models.fields.related.ManyToManyField: groups>,
       <django.db.models.fields.related.ManyToManyField: user_permissions>)

### モデルの主キーを構成するフィールドを取得する

New in Django 5.2.

Options.pk_fields

  モデルの主キーを構成するフィールドのリストを返します。

  モデルに `複合主キー` が定義されている場合、複合主キーで参照されたすべての `fields` が含まれます。

      from django.db import models

      class TenantUser(models.Model):
          pk = models.CompositePrimaryKey("tenant_id", "id")
          tenant_id = models.IntegerField()
          id = models.IntegerField()

      >>> TenantUser._meta.pk_fields
      [
          <django.db.models.fields.IntegerField: tenant_id>,
          <django.db.models.fields.IntegerField: id>
      ]

  それ以外の場合、 モデルの `主キー` として宣言された単一の値が含まれます。

      >>> User._meta.pk_fields
      [<django.db.models.fields.AutoField: id>]