Django & postgres - drawbacks of storing data as json in model fields
Storing data as json (whether in text-typed fields, or PostgreSQL's native jsontype) is a form of denormalization.
Like most denormalization, it can be an appropriate choice when working with very difficult to model data, or where there are serious performance challenges with storing data fully normalized into entities.
PostgreSQL reduces the impact of some of the problems caused by data denormalization by supporting some operations on json values in the database - you can iterate over json arrays or key/value pairs, join on the results of json field extraction, etc. Most of the useful stuff was added in 9.3; in 9.2, json support is just a validating data type. In 9.4, much more powerful json features will be added, including some support for indexing in json values.
There's no simple one-size-fits all answer to your question, and you haven't really characterized your data or your workload. Like most database challenges "it depends" on what you're doing with the data.
In general, I would tend to say it's best to relationally model the data if it is structured and uniform. If it's unstructured and non-uniform, storage with something like json may be more appropriate.
I'm sometimes using a TextField to store data with a structure that may change often (or very complex data) into model instances, instead of modelling everything with the relational paradigm.
I could mostly achieve the same kind of things using more models, foreignkeys and such, but it sometimes feels more straightforward to store JSON directly.
I still didn't delve into postgres JSON type (can be good for read-queries notably, if I understand well). And for the moment I perform some json.dumps and json.loads each time I want to access this kind of data.
I would like to know what are (theoretically) the performance and caching drawbacks of doing so (using JSON type and not), compared to using models for everything.
Having more knowledge about that could help me to later perform some clever comparison and profiling to enhance the overall performance.