我定义了一个User(最终)继承自的类models.Model。我想获取为此模型定义的所有字段的列表。例如,phone_number = CharField(max_length=20)。基本上,我想检索从Field该类继承的任何内容。
User
models.Model
phone_number = CharField(max_length=20)
Field
我以为我可以利用来检索这些inspect.getmembers(model),但是它返回的列表不包含任何这些字段。看起来Django已经掌握了该类,并添加了其所有魔术属性并去除了实际定义的内容。那么…我如何获得这些领域?它们可能具有为自己的内部目的检索它们的功能?
inspect.getmembers(model)
由于大多数答案已过时,因此我将尝试在Django 2.2上更新你的 信息-你的应用(帖子,博客,商店等)
1)从模型链接:https : //docs.djangoproject.com/en/2.2/ref/models/meta/
from posts.model import BlogPost all_fields = BlogPost._meta.fields #or all_fields = BlogPost._meta.get_fields()
注意:
all_fields=BlogPost._meta.get_fields()
还将获得一些关系,例如。你无法在视图中显示。 就我而言:
Organisation._meta.fields (<django.db.models.fields.AutoField: id>, <django.db.models.fields.DateField: created>...
和
Organisation._meta.get_fields() (<ManyToOneRel: crm.activity>, <django.db.models.fields.AutoField: id>, <django.db.models.fields.DateField: created>...
2)从实例
from posts.model import BlogPost bp = BlogPost() all_fields = bp._meta.all_fields
3)从父模型
假设我们将Post作为父模型,并且你希望查看列表中的所有字段,并且在Edit模式下将父字段设置为只读。
from django.contrib import admin from posts.model import BlogPost @admin.register(BlogPost) class BlogPost(admin.ModelAdmin): all_fields = [f.name for f Organisation._meta.fields] parent_fields = BlogPost.get_deferred_fields(BlogPost) list_display = all_fields read_only = parent_fields
Django 1.8及更高版本:
你应该使用get_fields():
get_fields()
[f.name for f in MyModel._meta.get_fields()]
从Django 1.8开始不推荐使用该get_all_field_names()方法,该方法将从1.10中删除。
get_all_field_names()
上面链接的文档页面提供了的完全向后兼容的实现get_all_field_names(),但是对于大多数目的,前面的示例应该可以正常工作。
Django 1.8之前的版本:
model._meta.get_all_field_names()
这应该够了吧。
这需要一个实际的模型实例。如果你拥有的只是的子类django.db.models.Model,则应调用myproject.myapp.models.MyModel._meta.get_all_field_names()
django.db.models.Model
myproject.myapp.models.MyModel._meta.get_all_field_names()