我已经定义了一个 User
类,它最终继承自 models.Model
. 我想获得为此模型定义的所有字段的列表 . 例如, phone_number = CharField(max_length=20)
. 基本上,我想检索从 Field
类继承的任何内容 .
我以为我能够通过利用 inspect.getmembers(model)
来检索这些,但它返回的列表实际上已经定义了't contain any of these fields. It looks like Django has already gotten a hold of the class and added all its magic attributes and stripped out what' . 那么......我怎样才能获得这些领域?它们可能具有为自己的内部目的检索它们的功能吗?
10 回答
对于Django 1.8及更高版本:
get_all_field_names()
方法是deprecated starting from Django 1.8 and will be removed in 1.10 .上面链接的文档页面提供了
get_all_field_names()
的完全向后兼容的实现,但是对于大多数用途[f.name for f in MyModel._meta.get_fields()]
应该可以正常工作 .对于1.8之前的Django版本:
这应该够了吧 .
这需要一个实际的模型实例 . 如果您拥有的只是
django.db.models.Model
的子类,那么您应该调用myproject.myapp.models.MyModel._meta.get_all_field_names()
这里提到的
get_all_related_fields()
方法已经deprecated in 1.8 . 从现在开始它是get_fields() .我发现将这个添加到django模型非常有帮助:
这可以让你做到:
这样就可以了 . 我只在Django 1.7中测试它 .
Model._meta.local_fields
不包含多对多字段 . 你应该使用Model._meta.local_many_to_many
获取它们 .这对我有用
django==1.11.8
MyModel._meta.get_all_field_names()
是 deprecated 几个版本和Django 1.10中的 removed .这是向后兼容的建议from the docs:
只是添加,我使用自我对象,这对我有用:
目前尚不清楚您是否有类的实例或类本身并尝试检索字段,但不管怎样,请考虑以下代码
Using an instance
Using a class
至少有Django 1.9.9 - 我目前使用的版本 - ,请注意
.get_fields()
实际上也是"considers"任何外国模型作为字段,这可能有问题 . 说你有:它遵循
而如@Rockallite所示
为什么不使用它:
输出示例: