获取Django模型的字段名列表
简要概述
-
- Djangoモデル(≒テーブル)に定義しているフィールド名の一覧を取得する
- 確認環境:Windows10、Python 3.7.2
基于希望支持导入可变长度的CSV数据的动机,我想提取Django模型中定义的字段名的列表。以下是该示例逻辑。
1. 模型的内容
在这里,我们定义了一个名为”CSVData”的模型,它具有8个项目(col1~col8),作为示例。
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()”来获取字段的元数据。
-
- Djangoドキュメント Model _meta API
- Djangoモデルのフィールドがクラスから消える話
3. 获取和整理的逻辑
接下来,我在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. 查看元数据
上述的输出中(见*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>)
解析元数据和获取名称
我使用enumerate函数来进行分解,并将通过“.name”获得的字段名逐个传入列表中。
6. 确认成果的检查
当使用print输出结果(参见上述※2)时,以下数值填入其中。
['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', 'col8']
以上。
.