##概要
- 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']
以上。