1. ホーム
  2. django

[解決済み] Django でモデルのフィールドを取得する

2022-05-02 04:54:09

質問

Django のモデルがあるとして、そのすべてのフィールドをリストアップしようと しています。 モデル属性の _meta を使ってこれを行う例をいくつか見ましたが、meta の前にあるアンダースコアは、 _meta 属性がプライベート属性であり、直接アクセスしてはいけないということを示していませんか? ... 例えば、将来的に_metaのレイアウトが変わって、安定したAPIにならない可能性があるから?

_metaは例外なのでしょうか? 安定していてすぐに使えるのか、それともアクセスするのはバッドプラクティスとされるのか? あるいは、_meta属性を使わずにモデルのフィールドをイントロスペクトする関数や他の方法があるのでしょうか? 以下は、_meta属性を使用してこれを行う方法を示すいくつかのリンクのリストです。

何かアドバイスがあれば、よろしくお願いします。

django オブジェクトの取得/設定フィールド

http://www.djangofoo.com/80/get-list-model-fields

django のモデルフィールドをイントロスペクトする方法は?

どのように解決するのですか?

_meta は非公開ですが、比較的安定しています。これを正式に文書化し、アンダースコアを削除しようとする努力がなされていますが、それは1.3か1.4の前に行われるかもしれません。多くの人がこれを使用しているため、後方互換性を確保するための努力がなされると思います。

特に互換性を重視するのであれば、モデルを受け取ってフィールドを返す関数を書くとよいでしょう。そうすれば、将来的に何かが変わっても、ひとつの関数を変更するだけで済みます。

def get_model_fields(model):
    return model._meta.fields

のリストが返されると思います。 Field オブジェクトを作成します。インスタンスから各フィールドの値を取得するには getattr(instance, field.name) .

更新: Django の貢献者は、Google Summer of Code の一環として、_Meta オブジェクトを置き換える API の開発に取り組んでいます。見てください。

- https://groups.google.com/forum/#!topic/django-developers/hD4roZq0wyk

- https://code.djangoproject.com/wiki/new_meta_api