1. ホーム
  2. ジャンゴ

[解決済み】Django: モデルフィールドのリストを取得しますか?

2022-04-02 18:30:38

質問

を定義しました。 User を(最終的に)継承するクラスです。 models.Model . このモデルに定義されているすべてのフィールドのリストを取得したいのです。例えば phone_number = CharField(max_length=20) . 基本的に、私は Field クラスがあります。

を活用することで、これらを取得することができるのではないかと考えました。 inspect.getmembers(model) しかし、それが返すリストにはこれらのフィールドが含まれていません。Django は既にこのクラスを手に入れ、魔法の属性を全て追加し、実際に定義されているものを 取り除いたようです。では...どうしたらこれらのフィールドを取得できるのでしょうか?おそらく、内部目的のためにそれらを取得する関数があるのでは?

解決方法は?

ほとんどの回答が古くなっているので、以下について更新してみます。 Django 2.2 Here posts-あなたのアプリ(投稿、ブログ、ショップなど)。

1) モデルから のリンクをクリックします。 https://docs.djangoproject.com/en/stable/ref/models/meta/

from posts.model import BlogPost

all_fields = BlogPost._meta.fields
#or
all_fields = BlogPost._meta.get_fields()

注意してください。

all_fields=BlogPost._meta.get_fields()

また、いくつかのリレーションシップを取得しますが、これは例えば、ビューに表示することはできません。

私の場合のように。

Organisation._meta.fields
(<django.db.models.fields.AutoField: id>, <django.db.models.fields.DateField: created>...

そして

Organisation._meta.get_fields()
(<ManyToOneRel: crm.activity>, <django.db.models.fields.AutoField: id>, <django.db.models.fields.DateField: created>...

2) インスタンスから

from posts.model import BlogPost

bp = BlogPost()
all_fields = bp._meta.fields

3) 親モデルから

親モデルがPostで、すべてのフィールドをリストで表示し、編集モードでは親フィールドを読み取り専用にしたい場合を考えてみましょう。

from django.contrib import admin
from posts.model import BlogPost 

@admin.register(BlogPost)
class BlogPost(admin.ModelAdmin):
    all_fields = [f.name for f in Organisation._meta.fields]
    parent_fields = BlogPost.get_deferred_fields(BlogPost)

    list_display = all_fields
    read_only = parent_fields