在 postgres,Django 中保存大型 json 对象

Posted

技术标签:

【中文标题】在 postgres,Django 中保存大型 json 对象【英文标题】:save large json objects in postgres, Django 【发布时间】:2022-01-06 12:02:40 【问题描述】:

我在 db 中有一个模型:

class Test(models.Model):
    title = models.CharField(max_length=32, verbose_name='title', default='')
    json = models.JSONField(default=dict)
    ...

我从前面获取数据并将其保存到数据库中,请求经常出现。一个 json 字段的平均权重是 10MB,但它可以有很大的不同,我不明白保存和提供它对我来说更好,我没有在服务器上使用 json 做任何工作。首先,我认为需要压缩此 json 并将其保存到数据库中,并在收到请求时将其解压缩。你能告诉我节省内存和查询执行时间的最佳方法吗?

另外,是否值得在单独的表中删除此 json,以便更改测试表中的其他数据花费更少的时间,还是使用 Test.objects.update() 更好?

【问题讨论】:

这可能有助于***.com/a/60938597/16020090 【参考方案1】:

虽然我很欣赏它不是最简单的解决方案,当然也不是最快或最简单的解决方案,但是,在数据库中存储“大型 json blob”可能永远不是一个好主意。

如果您有一个大对象并且需要在 django 模型中表示该数据,那么我建议您这样做。

而不是尝试将整个 json blob 保存为一个字符串,然后每次要读取一个属性时将其从数据库中加载并随后加载到内存中?这会对性能产生巨大影响,如果没有某种形式的缓存,您会发现很难缓解。

如果您真的必须将数据存储为整个 json blob,那么最好将其存储在文件系统本身上,然后创建一个具有 FileField 而不是 JSONField 的模型

您还可以做更多的 Pythonic / Django 风格的事情,即剖析您的对象、其每个属性和值,然后设计您的模型以便它可以存储每个数据类型。举个简单的例子:


    'field_a': 'string_value',
    'm2m_field_b': [
        
            'field_c': 6.4,
            'field_d': 'other string values'
        
    ]
    ...
 

这里有 2 个或更多,具体取决于 json blob 的复杂性。

    ParentModelA 1a) field_a 是一个字符串字段 ChildModelA 2a) fk 字段到父对象 2b) field_c 是一个浮点(最好是十进制)字段,在我们的相关模型上 2c) field_d 是另一个字符串字段,再次出现在我们的相关模型中。

我知道,一开始听起来很复杂,但是一旦你开始掌握对这些类型的对象建模的窍门,你就会意识到它非常重复,你不需要编写那么多额外的代码。

你问为什么要走这么远?看起来工作量很大却没有什么好处? 在未经训练的人看来,是的,没有冒犯。您必须考虑的是,您不能使用 django 与数据库的有用交互,例如聚合或预取和选择相关,因此您失去了很多优势并利用 django 数据库 API 必须提供.

如果您想在简单页面上加载其中一个字段值以在用户界面中向用户显示数据,也请考虑一下。

使用您的模型,您必须加载整个 json blob,然后显示简单的字符串和十进制值。

如果你有一组模型,你可以遍历 djangos 相关的字段,甚至可以使用常用的点符号直接在模板中使用对象。

【讨论】:

以上是关于在 postgres,Django 中保存大型 json 对象的主要内容,如果未能解决你的问题,请参考以下文章

在 django 的 postgres db 中将 json 保存为数组

Django 测试因 InternalError 失败:没有这样的保存点。 DB:Postgres,通过 mysql

在 Django 视图中将用户/帐户表添加到 Postgres

Django 正在为 Postgres 生成无效的 SQL

使用 Pandas 在 Python 中处理大型 SQL 查询?

Django 将图像路径保存到数据库