くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Djangoのモデルでフィールド名を取得する

DjangoのModelを定義するけど、フィールド名を取得したいなと思ったときの備忘録。
<Model>._meta.fiedlsでフィールド名が取得できるらしい

使い方

from django.db import models

class Group(models.Model):
    name = models.CharField(max_length=200)

class Member(models.Model):
    name = models.CharField(max_length=200)
    group = models.ForeignKey(Group, related_name='members')
    
    
    @classmethod
    def get_model_fields(cls):
      """
        フィールド名を取得する関数
      """
      # クラスに定義されているフィールド名を取得
      meta_fields = cls._meta.get_fields()
      
      # 全部取得してしまうので、必要なものだけにフィルタリング
      # related_nameを指定しているmodels.ForeignKeyがあると、
      # models.ManyToOneRelのフィールドが作成されるので除外する
      filtered_fields = filter(
          lambda x: not isinstance(x, models.ManyToOneRel),
          meta_fields
      )
      
      # フィルタリングしたフィールドからフィールド名に変換
      meta_field_names = map(lambda x: x.name, filtered_fields)
      return list(meta_field_names)

他にも除外したいフィールドがあれば、filterを書けて除外できる。

また、cls._meta.get_fields()は、Fieldクラスなので、

verbose_field_names = map(lambda x: x.verbose_name, filtered_fields)

とすれば、verbose_nameも取得できる。
AdminSiteとかは、これを使っているらしい。

以上!!

参考にしたサイトさま