在Django中获取模型的字段

给定一个Django模型,我试图列出所有的字段。 我已经看到一些使用_meta模型属性来做这个事情的例子,但是meta前面的下划线没有表明_meta属性是一个私有属性,不应该被直接访问? …因为,例如,_meta的布局可能会在将来改变,而不是一个稳定的API?

_meta是这个规则的例外吗? 它是稳定的,准备好使用还是被认为是不好的做法? 或者有没有一个函数或其他方式来反思模型的字段,而不使用_meta属性? 以下是使用_meta属性显示如何执行此操作的一些链接列表

任何意见,非常感谢。

django对象get / set字段

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

如何内省django模型领域?

_meta是私人的,但是相对稳定。 我们正在努力将其正式化,并将其logging下来,并删除在1.3或1.4之前可能发生的下划线。 我想我们会努力确保事情向后兼容,因为很多人一直在使用它。

如果您特别关心兼容性,请编写一个采用模型并返回字段的函数。 这意味着如果将来有什么变化,你只需要改变一个function。

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

我相信这将返回一个Field对象的列表。 要从实例中获取每个字段的值,请使用getattr(instance, field.name)

更新:Django贡献者正在开发一个API来替代_Meta对象作为Google夏季代码的一部分。 看到:
https://groups.google.com/forum/#!topic/django-developers/hD4roZq0wyk
https://code.djangoproject.com/wiki/new_meta_api

我知道这个post很老,但是我只是在乎告诉任何正在search相同的东西,有一个公共的和官方的API来做这个: get_fields()get_field()

用法:

 fields = model._meta.get_fields() my_field = model._meta.get_field('my_field') 

https://docs.djangoproject.com/en/1.8/ref/models/meta/

这是由Django在从模型构build表单时完成的。 它正在使用_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) 

_meta包含的模型字段在多个位置列出,作为各个字段对象的列表。 键盘是字段名称的字典可能会更容易。

在我看来,这是收集和组织模型领域对象的最不可靠和expression的方式:

 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中的此示例用法 。

现在有特殊的方法 – get_fields()

  >>> from django.contrib.auth.models import User >>> User._meta.get_fields() 

它接受两个参数,可以用来控制返回哪些字段:

  • include_parents

    是默认的。 recursion地包含在父类上定义的字段。 如果设置为False,则get_fields()将只search直接在当前模型上声明的字段。 直接从抽象模型或代理类inheritance的模型中的字段被认为是本地的,而不是父类。

  • include_hidden

    错误默认。 如果设置为True,get_fields()将包含用于支持其他字段function的字段。 这也将包括具有related_name(如ManyToManyField或ForeignKey),以“+”开头的任何字段

这个怎么样。

 fields = Model._meta.fields