获取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']

以上。
.

广告
将在 10 秒后关闭
bannerAds