LoginSignup
9
7

More than 3 years have passed since last update.

【Django】モデルのフィールド名リストを取得する

Posted at

概要

  • Djangoモデル(≒テーブル)に定義しているフィールド名の一覧を取得する
  • 確認環境:Windows10、Python 3.7.2

可変長のCSVデータの取り込みに対応したいという動機から、Djangoのモデルに定義しているフィールド名の一覧を取得したくなりました。そのサンプルロジックを記します。

1.Modelの内容

ここではサンプルとして、8項目(col1~col8)を持つ「CSVData」モデルを定義しました。

models.py
from django.db import models

class CSVData(models.Model):
    # CSVデータ取込テーブル
    col1 = models.CharField(verbose_name='001(A)列', max_length=254, null=True, blank=True)
    col2 = models.CharField(verbose_name='002(B)列', max_length=254, null=True, blank=True)
    col3 = models.CharField(verbose_name='003(C)列', max_length=254, null=True, blank=True)
    col4 = models.CharField(verbose_name='004(D)列', max_length=254, null=True, blank=True)
    col5 = models.CharField(verbose_name='005(E)列', max_length=254, null=True, blank=True)
    col6 = models.CharField(verbose_name='006(F)列', max_length=254, null=True, blank=True)
    col7 = models.CharField(verbose_name='007(G)列', max_length=254, null=True, blank=True)
    col8 = models.CharField(verbose_name='008(H)列', max_length=254, null=True, blank=True)

2.フィールド名取得関数

ググった結果、下記の参照リンク先の内容から「_meta API」の「.get_fields()」でフィールドのメタデータが取得できるらしいと分かりました。

3.取得と整形のロジック

次に、views.pyに次のような関数を定義して実行しました。

views.py
from django.views import View
from .models import CSVData

def getfnames(self, models):
        meta_fields = models._meta.get_fields()
        print(meta_fields)  # ※1

        ret = list()
        for i, meta_field in enumerate(meta_fields):
            if i > 0:
                ret.append(meta_field.name)
        print(ret)   # ※2
        return ret

4.メタデータの確認

printで出力(上記※1)したところ、「meta_fields」には以下の値が入っていました。
(注記:見やすく並べるため、カンマの後ろに改行を加えています)

(<django.db.models.fields.AutoField: id>,
 <django.db.models.fields.CharField: col1>,
 <django.db.models.fields.CharField: col2>,
 <django.db.models.fields.CharField: col3>,
 <django.db.models.fields.CharField: col4>,
 <django.db.models.fields.CharField: col5>,
 <django.db.models.fields.CharField: col6>,
 <django.db.models.fields.CharField: col7>,
 <django.db.models.fields.CharField: col8>)

5.メタデータの分解と、名前の取得

enumerate関数で分解し、「.name」で取得できたフィールド名を1つずつリストに流し込みました。

6.取得結果の確認

結果をprintで出力(上記※2)したところ、以下の値が入っていました。

['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', 'col8']

以上。

9
7
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
9
7