如何在Django中内省属性和模型字段?

shr*_*ddd 8 python django models

我试图获取给定对象的所有现有模型字段和属性的列表.是否有一种干净的方式来检查对象,以便我可以获得字段和属性的字典.

class MyModel(Model)
    url = models.TextField()

    def _get_location(self):
        return "%s/jobs/%d"%(url, self.id)

    location = property(_get_location)
Run Code Online (Sandbox Code Playgroud)

我想要的是返回一个如下所示的字典:

{
  'id' : 1,
  'url':'http://foo',
  'location' : 'http://foo/jobs/1'
}   
Run Code Online (Sandbox Code Playgroud)

我可以model._meta.fields用来获取模型字段,但这不会给我属性但不是真正的DB字段.

Joh*_*ery 10

如果您只想要模型字段和属性(使用属性声明的那些),那么:

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)

这里唯一的一点就是在类中运行以查找与属性描述符对应的字段.通过类访问它们给出了描述符,而通过实例它给出了值.