使用简单的 JSON 字段加速 Django 和 Postgres
Speed up Django & Postgres with simple JSON field
我有一个非常非常复杂的模型,有很多 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,看一看:PostgreSQL specific model fields
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
您也可以在此 link 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
我有一个非常非常复杂的模型,有很多 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,看一看:PostgreSQL specific model fields
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
您也可以在此 link 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