153

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

_meta はこの規則の例外ですか? 安定していてすぐに使用できますか、それともアクセスするのは悪い習慣と見なされますか? または、_meta 属性を使用せずにモデルのフィールドをイントロスペクトする関数またはその他の方法はありますか? 以下は、_meta 属性を使用してこれを行う方法を示すリンクのリストです。

どんなアドバイスでも大歓迎です。

django オブジェクトの get/set フィールド

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

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

4

11 に答える 11

187

_metaプライベートですが、比較的安定しています。それを形式化し、文書化し、アンダースコアを削除するための努力があります。これは、1.3または1.4より前に発生する可能性があります。とにかく多くの人が使用しているので、下位互換性を確保するための努力がなされると思います。

互換性が特に気になる場合は、モデルを取得してフィールドを返す関数を記述してください。つまり、将来何かが変更された場合でも、1つの機能を変更するだけで済みます。

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

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

更新:Djangoの寄稿者は、Google SummerofCodeの一部として_Metaオブジェクトを置き換えるAPIに取り組んでいます。参照: -https://groups.google.com/forum/#!topic/django -developers/hD4roZq0wyk-
https : //code.djangoproject.com/wiki/new_meta_api

于 2010-09-05T21:44:55.417 に答える
9

これは、モデルからフォームを構築するときに Django 自体が行うことです。_meta 属性を使用していますが、Bernhard が指摘したように、_meta.fields と _meta.many_to_many の両方を使用しています。django.forms.models.fields_for_model を見ると、次のように実行できます。

opts = model._meta
for f in sorted(opts.fields + opts.many_to_many):
    print '%s: %s' % (f.name, f)
于 2013-01-16T18:58:09.420 に答える
5

_meta に含まれるモデル フィールドは、それぞれのフィールド オブジェクトのリストとして複数の場所にリストされます。キーがフィールド名である辞書として扱う方が簡単かもしれません。

私の意見では、これはモデル フィールド オブジェクトを収集して整理するための最も冗長で表現力豊かな方法です。

def get_model_fields(model):
  fields = {}
  options = model._meta
  for field in sorted(options.concrete_fields + options.many_to_many + options.virtual_fields):
    fields[field.name] = field
  return fields

( django.forms.models.fields_for_model のこの使用例を参照してください。)

于 2013-12-08T21:39:16.577 に答える