如何获取对象的字段?
我正在写一个函数,用来把一个模型对象转换成字典(而且把所有的foreignkeys
也转换成字典,递归进行)。我从朋友那里了解到,可以通过查看obj._meta.fields
来获取模型的字段,但我在任何地方都找不到相关的文档。
我该怎么获取模型的字段呢?我该如何理解_meta
类里面的内容呢?
2 个回答
5
这里有一些关于它的文档,你可以看看,不过我们通常会找到一些在内部使用的django函数,比如 _meta.fields
、_meta.get_all_field_names()
和 _meta.get_field_by_name
。
对我来说,最好的发现这些函数的方法是通过iPython和按下Tab键来完成自动补全。或者直接查看源代码。
10
这看起来挺有意思的,所以我开始查找django.forms的源代码,特别是ModelForm的实现。我觉得ModelForm应该能很好地分析给定的实例,恰好有一个很方便的函数可以帮助你。
>>> 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框架,它声明了几个可能对你有用的emitters
,特别是BaseEmitter.construct()
这个方法。你应该能很容易地定义一个DictionaryEmitter
,用于除了RESTful序列化以外的其他目的。