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

Max*_*ore 2 django postgresql query-optimization

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

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

我可能有一个非常愚蠢但非常简单的想法.

要做这样的事情:

class VeryComplexModel(models.Model):

    # some_field
    # some_field
    # ...

    json = models.TextField()

    def save(self):
        json = serialize(self)
Run Code Online (Sandbox Code Playgroud)

在views.py中:

complexModels = ComplexModel.objects.get_values(json)
Run Code Online (Sandbox Code Playgroud)

在模板中:

{% for m in complexModels %}

    {{ m.some_field }}

    {{ m.some_field.some_fields.some_field }}

{% endif %}
Run Code Online (Sandbox Code Playgroud)

这是个坏主意吗?也许这是一个好主意,但我应该使用更合适的东西,如特殊的JSON字段或其他东西?

伟大的建议!

Chi*_*xit 11

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
Run Code Online (Sandbox Code Playgroud)

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

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

postgres_prompt=> create extension hstore;
Run Code Online (Sandbox Code Playgroud)

在您的迁移文件中,您需要添加它

from django.contrib.postgres.operations import HStoreExtension

class Migration(migrations.Migration):
    ...

    operations = [
        HStoreExtension(),
        ...
    ]
Run Code Online (Sandbox Code Playgroud)

这是在模型中使用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
Run Code Online (Sandbox Code Playgroud)

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