在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')
这是由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