gpt4 book ai didi

python - Django + Postgres : save JSON string directly into model as JSON type

转载 作者:行者123 更新时间:2023-11-28 22:32:48 25 4
gpt4 key购买 nike

我有一个 Django 模型,我想在其中保存无模式的键值元数据,所以我使用的是 django.contrib.postgres.fields.JSONField

键值数据是一个 Pandas 系列,默认情况下它不是 JSON 序列化的(由于 numpy.int64、numpy.float64 类型),所以我使用方便的 series.to_json() 返回一个已经序列化的 JSON 字符串。

为了将其保存到我的模型中,我在其上运行了 json.loads。但我知道当数据保存到 Postgres 时,会调用 json.dumps

如何避免这种不必要的反序列化/重新序列化步骤?

代码示例:

def create_model(pandas_series):
mdl = Model()
metadata = pandas_series.to_json() # gives a JSON string
mdl.metadata = json.loads(metadata) # string->dict, then dict->string
mdl.save()

最佳答案

瓶颈在哪里

我以编程方式创建了一个包含数千个元素的字典,它看起来像这样:

d = { ..., "a240": 240, "a243": 243, "a242", ...}

然后我在一个循环中 json.loads(json.dumps(d)) 1000 次。 1000 次迭代平均耗时 510 毫秒。

然后我创建了以下模型:

class JsonModel(models.Model):
jfield = JSONField()

将词典插入数据库1000次如下:

JsonModel.objects.create(jfield = d)

此操作平均耗时 21 秒。所以看起来真正的瓶颈在于将数据保存到数据库而不是在序列化反序列化步骤中。

总之,保存到数据库比 json 转储/加载慢大约 40 倍(但您的里程会因字典大小、数据库负载等而异)。

避免额外的序列化/反序列化步骤

根据上述数字,不转储/加载可能不值得。尽管如此,如果你热衷于尝试,要做的就是create a custom field .它可以像下面这样简单:

from django.contrib.postgres.fields import JSONField
class MyJsonField(JSONField):
def get_prep_value(self, value):
if isinstance(value, str):
return value
return super(MyJsonField,self).get_prep_value(value)

那么你的模型就可以

class JsonModel(models.Model):
metadata = MyJsonField()
....

然后在创建数据库记录的时候,你可以传入json序列化字符串而不是调用json.loads

mdl.metadata = metadata # no string->dict, then dict->string

关于python - Django + Postgres : save JSON string directly into model as JSON type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40593777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com