如何在python中用dict生成对象?

如何在python中用dict生成对象?,python,django,Python,Django,我目前有一个dict,其中: one_result = {'name':'Acme', 'description': 'Fun time', 'results': {'fun_status': 'Extra', 'fun_title': 'Foo' } } 我在代码中的许多地方访问此dict的值,并将许多结果放入数组并存储在DB中: class Record(models.Model): results = JSONField(d

我目前有一个dict,其中:

one_result = {'name':'Acme', 'description': 'Fun time', 
              'results': {'fun_status': 'Extra', 'fun_title': 'Foo' }
             }
我在代码中的许多地方访问此dict的值,并将许多结果放入数组并存储在DB中:

class Record(models.Model):
    results = JSONField(default=[], null=True, blank=True)
我希望保持干燥,并从结果中生成Python对象,这样我就可以直接访问属性,而不是通过键名称: result.name与result['name']


有没有一种方法可以让我创建一个由dict()支持的对象,并在我的数据库中轻松地序列化/反序列化为JSON?

一个简单的解决方案是直接添加到
self.\uuuuuu dict\uu

class Foo():
    def __init__(self, d):
        for k, i in d.items():
            if isinstance(i, dict):
                self.__dict__[k] = Foo(i)
            else:
                self.__dict__[k] = i
测试用例:

f = Foo({"a": "b", "c": {"d": "e"}, "f": ["g", "h", "i"]})
f.a
# 'b'

f.c
# <__main__.Foo at 0x1624c5c0>

f.c.d
# 'e'

f.f
# ['g', 'h', 'i']
f=Foo({“a”:“b”,“c”:{“d”:“e”},f”:[“g”,“h”,“i”]})
f、 a
#“b”
f、 c
# 
f、 c.d
#“e”
f、 f
#['g'、'h'、'i']

一个简单的解决方案是直接向
自我添加

class Foo():
    def __init__(self, d):
        for k, i in d.items():
            if isinstance(i, dict):
                self.__dict__[k] = Foo(i)
            else:
                self.__dict__[k] = i
测试用例:

f = Foo({"a": "b", "c": {"d": "e"}, "f": ["g", "h", "i"]})
f.a
# 'b'

f.c
# <__main__.Foo at 0x1624c5c0>

f.c.d
# 'e'

f.f
# ['g', 'h', 'i']
f=Foo({“a”:“b”,“c”:{“d”:“e”},f”:[“g”,“h”,“i”]})
f、 a
#“b”
f、 c
# 
f、 c.d
#“e”
f、 f
#['g'、'h'、'i']

将数据保存为JSON字段是否有特殊原因?是否有可能重复将数据保存为JSON字段的特殊原因?是否有可能重复
setattr(k,i)
setattr(k,Foo(i))
比直接使用
\uu dict\uuu
更可取,在我看来,@peterdegloper我倾向于同意,只是因为它对我来说更易读,但我没有足够的知识来区分利弊。如果您能提供详细建议,我们将不胜感激。基本上只是标准化和封装。使用
setattr
你永远不必担心你调用它的东西是否有自定义属性行为-
setattr(some对象,“some属性名”,some val)
可靠地做着与
some对象完全相同的事情。some属性名=some\val
setattr(k,i)
setattr(k,Foo(i))
比直接与IMO的
\uu dict\uuu
合作更好。@peterdegloper我倾向于同意,只是因为它对我来说更具可读性,但我没有足够的知识来区分利弊。如果您能提供详细建议,我们将不胜感激。基本上只是标准化和封装。使用
setattr
您不必担心调用它的对象是否具有自定义属性行为-
setattr(一些对象,“一些属性名”,一些值)
可靠地执行与
一些对象完全相同的操作。一些属性名=一些值