给定Django模型,我试图列出其所有字段。我已经看到了使用_meta模型属性执行此操作的一些示例,但是meta前面的下划线是否表示_meta属性是私有属性,不应直接访问?…例如,因为_meta的布局将来可能会更改,并且不是稳定的API?
_meta是该规则的例外吗?它是否稳定且可以使用,还是访问它的不正确做法?还是有一种功能或其他方法可以在不使用_meta属性的情况下自省模型的字段?以下是一些链接的列表,这些链接显示了如何使用_meta属性执行此操作
_meta是私有的,但相对稳定。我们正在努力对其进行形式化,记录和删除下划线,这可能在1.3或1.4之前发生。我想将尽一切努力来确保事物向后兼容,因为无论如何,很多人都在使用它。
_meta
如果你特别关注兼容性,请编写一个采用模型并返回字段的函数。这意味着,如果将来发生某些变化,则只需更改一个功能。
def get_model_fields(model): return model._meta.fields
我相信这将返回Field对象列表。要从实例获取每个字段的值,请使用getattr(instance, field.name)。
Field
getattr(instance, field.name)
更新:Django贡献者正在研究一个API,以替换_Meta对象作为Google Summer of Code的一部分。