How to store a dictionary in a Django database model's field
I just discovered the django-jsonfield package, which
is a reusable Django field that allows you to store validated JSON in your model.
Looks like a viable option to achieve what you want.
One convenient way to store a JSON representation in a model is to use a custom field type:
class JSONField(models.TextField): """ JSONField is a generic textfield that neatly serializes/unserializes JSON objects seamlessly. Django snippet #1478 example: class Page(models.Model): data = JSONField(blank=True, null=True) page = Page.objects.get(pk=5) page.data = {'title': 'test', 'type': 3} page.save() """ __metaclass__ = models.SubfieldBase def to_python(self, value): if value == "": return None try: if isinstance(value, basestring): return json.loads(value) except ValueError: pass return value def get_db_prep_save(self, value, *args, **kwargs): if value == "": return None if isinstance(value, dict): value = json.dumps(value, cls=DjangoJSONEncoder) return super(JSONField, self).get_db_prep_save(value, *args, **kwargs)
I saved this utils/fields.py and in my model from utils.fields import JSONField
. There are many more goodies in the django-annoying app, which is where this snippet came from.
Using a custom field type is my preferred solution - I'd rather have a few lines of custom code than support an entire 3rd party library for a single field type. Tony Abou-Assaleh has a great solution, but won't work for newer versions of Django.
This is verified to work with Django 1.10.4
import jsonfrom django.db import modelsfrom django.core.serializers.json import DjangoJSONEncoderclass JSONField(models.TextField): """ JSONField is a generic textfield that neatly serializes/unserializes JSON objects seamlessly. Django snippet #1478 example: class Page(models.Model): data = JSONField(blank=True, null=True) page = Page.objects.get(pk=5) page.data = {'title': 'test', 'type': 3} page.save() """ def to_python(self, value): if value == "": return None try: if isinstance(value, str): return json.loads(value) except ValueError: pass return value def from_db_value(self, value, *args): return self.to_python(value) def get_db_prep_save(self, value, *args, **kwargs): if value == "": return None if isinstance(value, dict): value = json.dumps(value, cls=DjangoJSONEncoder) return value