我正在尝试获取给定对象的所有现有模型字段和属性的列表。有没有一种干净的方法来内省对象,以便我可以获得字段和属性的字典。
class MyModel(Model)
url = models.TextField()
def _get_location(self):
return "%s/jobs/%d"%(url, self.id)
location = property(_get_location)
我想要的是返回一个如下所示的字典:
{
'id' : 1,
'url':'http://foo',
'location' : 'http://foo/jobs/1'
}
我可以用model._meta.fields
获取模型字段,但这并没有给我提供属性但不是真正的数据库字段的东西。
如果您严格只想要模型字段和属性(使用属性声明的字段和属性),那么:
def get_fields_and_properties(model, instance):
field_names = [f.name for f in model._meta.fields]
property_names = [name for name in dir(model) if isinstance(getattr(model, name), property)]
return dict((name, getattr(instance, name)) for name in field_names + property_names)
instance = MyModel()
print get_fields_and_properties(MyModel, instance)
这里唯一额外的一点是运行class查找与属性描述符对应的字段。通过类访问它们会给出描述符,而通过实例访问它们会给出值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)