首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django:获取模型字段列表?

Django:获取模型字段列表?
EN

Stack Overflow用户
提问于 2010-06-24 07:29:30
回答 15查看 205.8K关注 0票数 240

我定义了一个(最终)从models.Model继承的User类。我想要获取为此模型定义的所有字段的列表。例如,phone_number = CharField(max_length=20)。基本上,我希望检索从Field类继承的任何内容。

我以为可以通过利用inspect.getmembers(model)来检索这些字段,但是它返回的列表不包含这些字段中的任何字段。看起来Django已经掌握了这个类,并添加了它的所有神奇属性,并去掉了实际定义的内容。所以..。如何获取这些字段?它们可能有一个函数来检索它们,用于它们自己的内部目的?

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2019-06-22 15:44:30

由于大多数答案都过时了,我会尝试在Django 2.2这里更新你的帖子-你的应用程序(帖子,博客,商店等)。

1)来自模型链接:https://docs.djangoproject.com/en/stable/ref/models/meta/

代码语言:javascript
运行
复制
from posts.model import BlogPost

all_fields = BlogPost._meta.fields
#or
all_fields = BlogPost._meta.get_fields()

请注意:

代码语言:javascript
运行
复制
all_fields=BlogPost._meta.get_fields()

还将获得一些关系,例如:您不能在视图中显示。

和我的例子一样:

代码语言:javascript
运行
复制
Organisation._meta.fields
(<django.db.models.fields.AutoField: id>, <django.db.models.fields.DateField: created>...

代码语言:javascript
运行
复制
Organisation._meta.get_fields()
(<ManyToOneRel: crm.activity>, <django.db.models.fields.AutoField: id>, <django.db.models.fields.DateField: created>...

2)来自实例

代码语言:javascript
运行
复制
from posts.model import BlogPost

bp = BlogPost()
all_fields = bp._meta.fields

3)来自父模型的

假设我们将Post作为父模型,并且您希望查看列表中的所有字段,并在Edit模式下将父字段设置为只读。

代码语言:javascript
运行
复制
from django.contrib import admin
from posts.model import BlogPost 

@admin.register(BlogPost)
class BlogPost(admin.ModelAdmin):
    all_fields = [f.name for f in Organisation._meta.fields]
    parent_fields = BlogPost.get_deferred_fields(BlogPost)

    list_display = all_fields
    read_only = parent_fields
票数 102
EN

Stack Overflow用户

发布于 2010-06-24 07:34:10

Django 1.8及更高版本:

您应该使用get_fields()

代码语言:javascript
运行
复制
[f.name for f in MyModel._meta.get_fields()]

get_all_field_names()方法是deprecated starting from Django 1.8 and will be removed in 1.10

上面链接的文档页面提供了一个完全向后兼容的get_all_field_names()实现,但对于大多数目的来说,前面的示例应该可以很好地工作。

Django 1.8之前的版本:

代码语言:javascript
运行
复制
model._meta.get_all_field_names()

这应该能起到作用。

这需要一个实际的模型实例。如果您所拥有的只是django.db.models.Model的子类,那么您应该调用myproject.myapp.models.MyModel._meta.get_all_field_names()

票数 330
EN

Stack Overflow用户

发布于 2015-06-16 17:03:11

这里提到的get_all_related_fields()方法是deprecated in 1.8。从现在开始就是get_fields()

代码语言:javascript
运行
复制
>> from django.contrib.auth.models import User
>> User._meta.get_fields()
票数 77
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3106295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档