Django从TextField获取dict

2024-09-24 22:29:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用Django存储dict。 一个非常基本的解决方案是:

class foo(models.Model):
    bar = models.TextField()

fooInstance.bar = json.dumps(my_dict)

但我希望能够直接访问它,而不是经常使用json,所以我做了以下操作:

^{pr2}$

这在很大程度上是有效的,只是我不能做一件事:

fooInstance.bar['key'] = 'value'

这个表达式通过了,没有错误。但是这个价值没有被设定。 有人知道怎么做吗?在

感谢任何帮助。在


Tags: djangojsonmodelfoomodelsmybar解决方案
2条回答

因此,不必在每次更改栏时更新栏,而是只在保存前更改栏。 我的解决办法是:

class foo(models.Model)
    _bar = models.TextField()

        def __getattr__(self, attr):
            if attr == 'bar':
                import json
                try:
                    self.bar = json.loads(self._bar)
                except ValueError:
                    return {}
                return self.bar
            else:
                return super(foo, self).__getattr__(self, attr)

        def save(self):
            import json
            if hasattr(self, bar):
                self._bar = json.dumps(self.bar)
            super(foo, self).save()

这很管用。我可以和他们一起工作实例.foobar作为常规的dict,并保存到数据库。在

虽然最好使用JSONField来处理它,但是我将回答您的问题,因为它不是强制执行特定的DB后端。在

问题的根本原因是,每次在模型实例上调用bar时,都会创建并返回一个新字典,因此您的更改将丢失。在

您应该将创建的字典存储在属性中,以避免这种重新创建行为。在

class foo(models.Model):
    _bar = models.TextField()

    def get_bar(self):
        dict_value = getattr(self, '_bar_dict', None)
        if not dict_value:
            import json
            dict_value = json.loads(self._bar)
            setattr(self, '_bar_dict', dict_value)
        return dict_value

    def set_bar(self, new_bar):
        import json
        self._bar = json.dumps(new_bar)
        self._bar_dict = dict(new_bar)

    bar = property(get_bar, set_bar)

或者您可以使用@cached_property装饰器。[见12]

相关问题 更多 >