I need to store some data in a Django model. These data are not equal to all instances of the model.
At first I thought about subclassing the model, but I’m trying to keep the application flexible. If I use subclasses, I’ll need to create a whole class each time I need a new kind of object, and that’s no good. I’ll also end up with a lot of subclasses only to store a pair of extra fields.
I really feel that a dictionary would be the best approach, but there’s nothing in the Django documentation about storing a dictionary in a Django model (or I can’t find it).
If it's really dictionary like arbitrary data you're looking for you can probably use a two-level setup with one model that's a container and another model that's key-value pairs. You'd create an instance of the container, create each of the key-value instances, and associate the set of key-value instances with the container instance. Something like:
class Dicty(models.Model): name = models.CharField(max_length=50) class KeyVal(models.Model): container = models.ForeignKey(Dicty, db_index=True) key = models.CharField(max_length=240, db_index=True) value = models.CharField(max_length=240, db_index=True)
It's not pretty, but it'll let you access/search the innards of the dictionary using the DB whereas a pickle/serialize solution will not.
If you don't need to query by any of this extra data, then you can store it as a serialized dictionary. Use
repr to turn the dictionary into a string, and
eval to turn the string back into a dictionary. Take care with eval that there's no user data in the dictionary, or use a
For example, in the
update methods of your
views, you can add:
if isinstance(request.data, dict) == False: req_data = request.data.dict().copy() else: req_data = request.data.copy() dict_key = 'request_parameter_that_has_a_dict_inside' if dict_key in req_data.keys() and isinstance(req_data[dict_key], dict): req_data[dict_key] = repr(req_data[dict_key])