1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Django】_metaでモデルのメタデータにアクセスする方法

Posted at

概要

Djangoで見る_metaとはどんなツールなのか?
実際にサンプルコード触りながら調べてみたので紹介します。

前提

以下のようなDBテーブルを作成したとします。

image.png

models.pyは以下の通り。

class Country(models.Model):
    name = models.CharField(max_length=100, null=True, blank=True)
    capital = models.CharField(max_length=100, null=True, blank=True)
    population = models.IntegerField(null=True, blank=True)
    continent = models.CharField(max_length=50, null=True, blank=True)
    language = models.CharField(max_length=50, null=True, blank=True)
    currency = models.CharField(max_length=50, null=True, blank=True)

    class Meta:
        db_table = 'country'

サンプルコード1

DjangoのCountryモデルの全てのフィールド名を取得し、それらを出力するサンプルコードはこちら。

_metaはDjangoのモデルメタデータオプションで、モデルに関するメタデータにアクセスするために使用します。

from world.models import Country


# Countryモデルの全てのフィールドを取得
fields = Country._meta.fields
print(fields)

# 結果
# (<django.db.models.fields.BigAutoField: id>, <django.db.models.fields.CharField: name>, <django.db.models.fields.CharField: capital>, <django.db.models.fields.IntegerField: population>, <django.db.models.fields.CharField: continent>, <django.db.models.fields.CharField: language>, <django.db.models.fields.CharField: currency>)

for field in fields:
    print(f"Field Name: {field.name}")
    print(f"Field Type: {field.get_internal_type()}")

# 結果
# Field Name: id
# Field Type: BigAutoField
# Field Name: name
# Field Type: CharField
# Field Name: capital
# Field Type: CharField
# Field Name: population
# Field Type: IntegerField
# Field Name: continent
# Field Type: CharField
# Field Name: language
# Field Type: CharField
# Field Name: currency
# Field Type: CharField

fieldsは、モデルの全てのフィールドオブジェクトをリストとして返します。

nameでname属性(フィールドの名前)を返すので、DBでいうカラム名がすべて取得できますね。
field.get_internal_type()は、そのフィールドの内部タイプを文字列として返すメソッド。これにより、どんなデータ型かどうかがわかります。CharFieldIntegerFieldなどどのような種類かわかります。

サンプルコード2

他にもフィールドオブジェクトには多くのメソッドがあるようです。

from world.models import Country


meta = Country._meta

# モデルの名前を取得
print(f"Model Name: {meta.verbose_name}")

# 結果
# Model Name: country

# モデルの主キーのフィールド名を取得
print(f"Primary Key Field Name: {meta.pk.name}")

# 結果
# Primary Key Field Name: id

# モデルの特定のフィールドオブジェクトを取得
print(f"Get Field: {meta.get_field('name')}")

# 結果
# Get Field: world.Country.name

参考

他にも色々メソッドがあり、以下で紹介されています。
ご参考までに。

公式ドキュメント

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?