I had a serious need for a JSON field for django. There were a couple out
there, but none packaged up nicely on bitbucket/github that were usable
with pip install -e
.
So I took the code from David Cramer's blog, and packaged it up.
UPDATE: Support for Pyodbc fixed and tested from master version of https://github.com/michiya/django-pyodbc
FOR NEW WINDOWS LINUX DRIVER: https://github.com/michiya/django-pyodbc/commit/e1ab6b9a282900c7076b42cf55b17f879b5fca2b
To use, just install the package, and then use the field:
from django.db import models import jsonfield class MyModel(models.Model): the_json = jsonfield.JSONField()
Now, it will validate the JSON on entry, and store it as a string in the database. When you instantiate/fetch the object, it will be turned back into a python list/dict/string.
There is also a TypedJSONField
, that allows you to define data types that must be included within each object in the array. More documentation to follow.
If no default
is provided, and null=True
is not passed in to the
field constructor, then a default of {}
will be used.
There are also a couple of other bits and bobs:
This allows you to convert a python data structure into JSON within a template:
{% load jsonify %} <script> var foo = {{ bar|jsonify }}; </script>
Add support for storing data using Postgres' 9.2's JSON data type.
Add LICENSE file. Added TypedJSONField.
Allow {{ variable|jsonify }}
to work with querysets.
Prevent circular import problem with django 1.3.1 and gargoyle.
Better handle null=True and blank=True: it should make sense what they do now.
Allow for '{}' and '[]', and make them not appear to be None.
Ensure the version number file is installed with the package.
Store the version number in one place only, now.
Oops. Packaging error prevented install from pypi. Added README.rst to manifest.
Converting to string does nothing, as serializing a model instance with a JSONField would have a string version of that field, instead of it embedded inline. (Back to pre 0.8 behaviour).
Added better querying support: (field__contains={'key':'value','key2':'value2'}
works.)
Removed JSONTableWidget from package.
(Many thanks to IanLewis for these features)
Supports django 1.2
Supports callable and json serializable objects as default
Implemented get_db_prep_value()
Add tests and test runner.
Removed JSONTableWidget from README.
Don't fail when trying to install before django is installed.
First time I tagged releases.
Convert date/time objects nicely to/from ISO strings (YYYY-mm-dd HH:MM:SS TZNAME). This is actually a bit tricky, as we don't know if we are expecting a date/time object. We may parse objects as we go, but there could be some performance issues with this.