我有一个像这样的peewee模型:

class User(peewee.Model):
    name = peewee.CharField(unique=True)
    some_json_data = peewee.CharField()
    requested_at = peewee.DateTimeField(default=datetime.now())

我知道peewee不支持MySQL DB的JSONField,但是无论如何,尽管我可以将其转换为字符串格式并保存为db,但我可以按原样检索它。

例如,假设这是我正在写入数据库的JSONField:
[
  {
    'name': 'abcdef',
    'address': 'abcdef',
    'lat': 43176757,
    'lng': 42225601
  }
]

当我获取此(JSONField)数据时,输出如下所示:
u'[{u\'name\': u\'abcdef\',  u\'address\': u\'abcdef\', u\'lat\': 43176757, u\'lng\': 42225601\'}]'

尝试一个简单的json负载给我这样的错误:



我已经尝试过将json数据进行json转储,然后再将其输入数据库并查看是否可以正常工作,但是我仍然没有运气。

我正在寻找一个涉及peewee的custom field选项的解决方案,并且我想保留我的MySQL。有人可以指导我吗?

最佳答案

您的代码中可能发生的情况是Peewee在值上调用str()(或unicode()),而不是将其转储到JSON,因此Python字符串表示形式已保存到数据库中。要手动执行JSON,只需设置import json,然后在设置字段时调用json.dumps(obj),并在获取字段时调用json.loads(db_value)

好像有一个为某些数据库(SQLite,PostgreSQL?)定义的Peewee游戏室扩展定义了JSONField类型-参见JSONField docs here

另外,我认为定义一个自定义的JSONField类型并不困难,它会自动将json加载/转储。 playhouse/kv.py中有一个简单的示例:

class JSONField(TextField):
    def db_value(self, value):
        return json.dumps(value)

    def python_value(self, value):
        if value is not None:
            return json.loads(value)

关于python - 适用于MySQL的Peewee ORM JSONField,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40553790/

10-12 22:35