2016-06-01 17 views
0

Ich habe ein sehr sehr komplexes Modell mit vielen verwandten Modelle von FK und M2M, die auch viele Beziehungen haben usw.beschleunigen Django & Postgres mit einfachen JSON Feld

Also, eine Liste solcher Objekte Rendering ist eine sehr teure SQL-Operation, und ich möchte sie optimieren. (select_related und prefetch_related Hilfe, aber ein wenig)

Ich habe vielleicht eine sehr dumme, aber sehr einfache Idee.

so etwas wie dies zu tun:

class Very ComplexModel(models.Model): 

    # some_field 
    # some_field 
    # ... 

    json = models.TextField() 

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

in views.py:

complexModels = ComplexModel.objects.get_values(json) 

Und in Vorlage:

{% for m in complexModels %} 

    {{ m.some_field }} 

    {{ m.some_field.some_fields.some_field }} 

{% endif %} 

Ist es eine schlechte Idee? Vielleicht ist es eine gute Idee im Allgemeinen, aber ich sollte geeignetere Sachen wie spezielles JSON Feld oder etwas verwenden?

Vielen Dank für Ratschläge!

Antwort

7

Django unterstützt JSONField für PostgreSQL, hier ist das Beispiel

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 

auch Sie mehr darüber auf diesen Link lesen https://docs.djangoproject.com/en/dev/ref/contrib/postgres/fields/#jsonfield

Sie können auch HStoreField in postgresql ausprobieren, HStoreField ist schneller als das JSONField, für die Verwendung von HSTORE müssen Sie die Hstore-Erweiterung in Postgresql

aktivieren
postgres_prompt=> create extension hstore; 

in Ihrer Migration Datei benötigen Sie dieses

from django.contrib.postgres.operations import HStoreExtension 

class Migration(migrations.Migration): 
    ... 

    operations = [ 
     HStoreExtension(), 
     ... 
    ] 

hier hinzuzufügen, ist ein Beispiel für Hstore in Ihren Modellen:

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 

mehr wissen über diese auf die l gehen: https://docs.djangoproject.com/en/1.9/ref/contrib/postgres/fields/#hstorefield