python - 如何获取对象的字段?

标签 python django database orm

我正在制作一个函数,将模型对象转换为字典(并将所有 foreignkeys 递归地转换为更多字典)。我从一个 friend 那里了解到,我可以通过查看 obj._meta.fields 来获取模型的字段,但我无法在任何地方找到这方面的文档。

如何获取模型的字段?如何解释可以在 _meta 类中找到的内容?

最佳答案

这看起来相当有趣,所以我查看了 django.forms 源代码,专门寻找 ModelForm 实现。我认为 ModelForm 会非常擅长自省(introspection)给定的实例,而且碰巧有一个方便的函数可以帮助您。

>>> from django.forms.models import model_to_dict
>>> from django.contrib.auth.models import Group
>>> g = Group.objects.filter()[0]
>>> d = model_to_dict(g)
>>> d
{'permissions': [40, 41, 42, 46, 47, 48, 50, 43, 44, 45, 31, 32, 33, 34, 35, 36, 37, 38, 39], 'id': 1, 'name': u'Managers'}
>>> 

可以理解,_meta 属性没有记录,因为它内部实现细节。不过,我看不到它会很快发生变化,因此使用起来可能相对安全。您可能可以使用上面的 model_to_dict 函数作为开始执行您想要执行的操作。应该不会有太大的变化。如果您计划递归地包含模型,请注意反向关系。

您可能还想调查另一个途径。 django-piston 是一个 RESTful 框架,它声明了几个可能对您有用的 emitter,尤其是 BaseEmitter.construct() 方法。您应该能够很容易地定义一个 DictionaryEmitter 用于 RESTful 序列化以外的目的。

关于python - 如何获取对象的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5371531/

相关文章:

python - 如何在 Mac OS X 10.6 上使用 Python 3 和 Xcode 3 安装 PyObjC

python - 如何有效地计算到 numpy 中掩码中最近的 1 的距离?

python - 迁移与 forms.py 冲突

mysql - 在确保非主键列(即 wid)唯一且自动递增的同时处理并发 SQL 插入的正确实现是什么?

python - 如何将base64字符串转换为图像?

python - 如何有效地使用 Python 属性?

python - 使用过滤器后端覆盖 ModelViewSet 的查询集

django - 已使用不同的查询集进行查找

mysql - 在 Rails 中使用 MYSQL View

ruby-on-rails - 是否可以创建一个在其行创建时定义的不明确外键?