我如何在Django中审查属性和模型字段?

8 浏览
0 Comments

我如何在Django中审查属性和模型字段?

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

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来获取模型字段,但这并不会给我像属性这样不是真正的数据库字段的东西。

admin 更改状态以发布 2023年5月24日
0
0 Comments

问题在于你说你只想要字段,但是又把属性加入到混合中,这就让事情变得复杂了。在Python中,实际上没有办法简单地区分属性和其他随机方法。这与Django无关:仅仅是因为属性只是通过描述符访问的方法而已。因为类中的任意数量的东西也是描述符,你会很难区分它们。

你不能在类级别定义一个包含你想要的所有属性的列表,然后只调用每个元素的 getattr 吗?

0
0 Comments

如果您严格只想要模型字段和属性(那些使用property声明的字段和属性),则:\n\n

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)

\n\n此处唯一额外的部分是通过类来查找与属性描述符对应的字段。通过类访问它们会给您描述符,而通过实例访问则会给您值。

0