2012-09-13 12 views

risposta

29

[Nb. Molto è accaduto da quando la questione è stata inviata così ho pensato di aggiornare la risposta troppo - ora anche nuovo Django-PostgreSQL e PostgreSQL 9.3 informazioni]

PostgreSQL 9,3

supporto JSON in PostgreSQL (si veda la doc sta diventando sempre più e più interessante, ora è possibile cercare nei campi JSON come se fossero colonne di database! Questo supporto è ancora di base e non alla pari con gli operatori di colonne standard (vedi prima), in quanto tale sarà agevole da utilizzare tramite Django ORM

PostgreSQL 9.2

Il tipo di dati JSON è basically text in pgSQL 9.2. Ciò che viene aggiunto è la convalida JSON: utile, ma non sterzata.

** Django e PostgreSQL JSON

Un recente Kickstarted backed development per il supporto PostgreSQL avanzata in Django è stato finanziato a pochi mesi fa. Comprenderà il supporto avanzato per il tipo JSON, ma probabilmente solo in 9.4:

Il team Postgres ha recentemente unito il supporto per un tipo di dati jsonb - JSON memorizzato in modo binario. È probabile che ritarderò il supporto JSON fino a quando Postgres 9.4 non sarà disponibile e supporterò solo il tipo di dati jsonb. Ci sono diversi motivi per questo, il più significativo è che l'attuale tipo di dati JSON è severamente limitato nella sua implementazione, mancando anche un operatore di uguaglianza. Ciò significa che alcune parti del codice di annotazione Django generano query non valide (vedi questo rapporto) e significa anche che una ricerca __exact deve essere proibita. Gestire correttamente tutti questi casi edge in Django si tradurrebbe in un'enorme quantità di complessità, ei vantaggi che si ottengono oltre l'archiviazione di json in un campo di testo sono in realtà piuttosto limitati. La versione 9.4 è prevista verso la fine di quest'anno, pertanto i campi JSON probabilmente saranno disponibili solo nella versione 1.8.

Fonte: mjtamlyn blog

Psycopg anche ora supporta in modo nativo il JSON field (così come hstore).

** fai da te in Django **

In Django è abbastanza facile creare il proprio campo di modello che utilizza uno speciale tipo di database, vedere field db_type().

Si prega di notare che:

  1. questo dovrebbe funzionare solo sotto pgSQL - si stanno limitando la vostra portabilità del codice (anche se è possibile condizionale restituire un tipo di 'testo' su altri database)
  2. si attualmente per lo più guadagno solo validazione JSON lato database
  3. e naturalmente il piacere di recuperare direttamente un oggetto JSON!

Ma attenzione che Python non abbia/direct/support per JSON, quindi non si sta veramente saltando il costo di dump/load di json in python; si evita la conversione di stringhe, ma non ho controllato le parti interne o il benchmark per vedere se c'è una vera differenza.

con PostgreSQL 9.3 e in seguito sembra che le cose potrebbero diventare più interessanti

Si potrebbe anche iniziare dal django JSONField e ottenere un sacco di piatto boilercode già, semplicemente l'override del metodo db_type.

Quello che suona, a mio parere, più interessante e degno di un lock-in del database (adoro pgSql, in ogni caso!), È l'opzione in pgSQL per riattivare i dati come una struttura JSON usando array_to_json and row_to_json. Ciò richiederebbe comunque una modifica più seria ai querysets, il che è fuori dalla portata della tua domanda.

+0

Non riesci a indicizzare i campi all'interno del tipo JSON? –

+0

Il collegamento seguente mostra un'opzione per consentire l'indicizzazione, in pratica lo cambia da testo a campo char https://github.com/bradjasper/django-jsonfield#other-fields – stormlifter

+0

Aveva questa stessa domanda e un paio di altri punti di dati: (1) 'django-pgfields' fornisce wrapper per usare il tipo di dati JSON, ma nessun accesso nativo alle funzioni di ricerca di JSON di Postgres. (2) un kickstarter è stato completamente finanziato a febbraio 2014 per implementare il supporto nativo Django per tutti i tipi di dati Postgres in 'django.contrib.postgres' con una consegna target per Django 1.8. Il codice rilasciato pubblicamente è progredito solo in funzioni di base: https://www.kickstarter.com/projects/mjtamlyn/improved-postgresql-support-in-django – mirth23

8

A partire da Django 1.9, JSONField è disponibile nel modulo django.contrib.postgres.fields fornito con Django. Questo campo utilizza il tipo di campo PostgreSQL jsonb (non json).

Problemi correlati