【问题标题】:Speed up Django & Postgres with simple JSON field使用简单的 JSON 字段加速 Django 和 Postgres
【发布时间】:2016-10-01 01:45:56
【问题描述】:

我有一个非常复杂的模型,有很多 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 query-optimization


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      Django 支持 JSONField for PostgreSQL,看看:PostgreSQL specific model fields

      【讨论】:

        猜你喜欢
        • 2018-11-07
        • 2016-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-06
        相关资源
        最近更新 更多