给定一个Django模型,我试图列出它的所有字段.我见过一些使用_metamodel属性的例子,但是meta前面的下划线不是表示_meta属性是私有属性,不应该直接访问吗...例如,因为_meta的布局将来可能会改变,而不是一个稳定的API?

元是此规则的例外(_META)吗?它是否稳定且随时可以使用,或者访问它是否被认为是不好的做法?或者,是否有函数或其他方法可以在不使用_meta属性的情况下自省模型的字段?以下是一些链接的列表,显示了如何使用_meta属性执行此操作

如有任何建议,我们将不胜感激.

django object get/set field

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

How to introspect django model fields?

推荐答案

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

如果您特别关心兼容性,请编写一个函数,该函数接受一个模型并返回字段.这意味着,如果将来发生了变化,你只需要改变一个功能.

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

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

更新:Django的贡献者正在开发一个API来取代_Meta对象,作为Google Summer代码的一部分.请参阅:
-https://groups.google.com/forum/#!topic/django-developers/hD4roZq0wyk
-https://code.djangoproject.com/wiki/new_meta_api

Django相关问答推荐

如何在对接合成时创建两个Postgres数据库?

Django modelform在包含在另一个模板中时不呈现

APIView查询未返回任何结果

如何在Django中显示多个相关对象

如何在Django模板中有条件地传递值给with变量?

Django AWS S3对象存储boto3媒体上传报错

无法创建超级用户,因为 Django 中的一列(外键)不能为空

Django ORM __in 但不是精确的,包含不区分大小写的?

在 GoDaddy 上安装 django 站点

django REST 框架 - 嵌套 ModelSerializer 的有限查询集?

如何判断 Python unicode 字符串是否包含非西方字母?

Django 登录到控制台

Django:如何使用动态(非模型)数据预填充 FormView?

ImportError:升级到 Django 4.0 后无法从 'django.conf.urls' 导入名称 'url'

使用 get_object_or_404 获取数据库值

如何向所有 Django 响应添加 HTTP 标头

django - 使用 get_or_create 自动创建用户时设置用户权限

Django模板转换为字符串

Django 多项 Select 字段/复选框 Select 多个

Django 中的自定义 HTTP 标头