django - 使用简单的 JSON 字段加速 Django 和 Postgres

标签 django postgresql query-optimization

我有一个非常非常复杂的模型,有很多 FK 和 M2M 的相关模型,它们也有很多关系等。

因此,呈现此类对象的列表是一项非常昂贵的 SQL 操作,我想对其进行优化。 (select_related 和 prefetch_related 有帮助,但很少)

我可能有一个非常愚蠢但非常简单的想法 - 定义保存方法,它将所有对象的数据序列化到一个字段存储 JSON

做这样的事情:

class VeryComplexModel(models.Model):

    # some_field
    # some_field
    # ...

    json = models.TextField()

    def save(self):
        json = serialize(self)

在 views.py 中:

complexModels = ComplexModel.objects.get_values(json)

在模板中:

{% for m in complexModels %}

    {{ m.some_field }}

    {{ m.some_field.some_fields.some_field }}

{% endif %}

这是个坏主意吗?总的来说这可能是个好主意,但我应该使用更合适的东西,比如特殊的 JSON 字段之类的东西?

非常感谢您的建议!

最佳答案

Django 支持 PostgreSQL 的 JSONField,这里是例子

from django.contrib.postgres.fields import JSONField
from django.db import models

class Dog(models.Model):
    name = models.CharField(max_length=200)
    data = JSONField()

    def __str__(self):  # __unicode__ on Python 2
        return self.name

您也可以在此链接上阅读更多信息 https://docs.djangoproject.com/en/dev/ref/contrib/postgres/fields/#jsonfield

您也可以在 postgresql 中试用 HStoreField,HStoreField 比 JSONField 更快,要使用 HSTORE,您需要在 Postgresql 中启用 Hstore 扩展

postgres_prompt=> create extension hstore;

在你的迁移文件中你需要添加这个

from django.contrib.postgres.operations import HStoreExtension

class Migration(migrations.Migration):
    ...

    operations = [
        HStoreExtension(),
        ...
    ]

这是在模型中使用 Hstore 的示例:

from django.contrib.postgres.fields import HStoreField
from django.db import models

class Dog(models.Model):
    name = models.CharField(max_length=200)
    data = HStoreField()

    def __str__(self):  # __unicode__ on Python 2
        return self.name

要了解更多信息,请访问 l:https://docs.djangoproject.com/en/1.9/ref/contrib/postgres/fields/#hstorefield

关于django - 使用简单的 JSON 字段加速 Django 和 Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37572931/

相关文章:

django - 将调试控制台添加到 django 错误页面

python - MySQL AB,HKEY_LOCAL_MACHINE 中的 MySQL Server 5.5 文件夹不存在

postgresql - 来自 Homebrew 软件的 osm2pgsql 和 postgresql 9.1 无法在 Mac 上连接

python - Django REST Framework 中除 AUTH_USER_MODEL 之外的用户模型

python - 将变量传递到扩展模板中?

ruby-on-rails - Rails 中的 ORDER BY 和 DISTINCT ON (...)

postgresql - 使用 pgAdmin 访问远程 Postgres 服务器

mysql - 如何优化简单 Web 和数据库应用程序的响应时间

php - 此查询有什么问题?从 mysql 表中加载超过 220,000 条记录的数据需要 0.5 到 0.6 秒

mysql - 从查询中删除 'using filesort'