DRF serializers are great! The make validating data and converting json 
data to python types super flexible and reliable. I would like to start 
using them at the model level, not only at the view (api endpoint) level.

The use case is that I have lots of models which contain  a JSONField, and 
contain data which may be referenced by parts of the sytem not directly 
related to an api endpoint. I would like to use a DRF serializer to get the 
right python types and defaults when that date comes out of the database. 
Has anyone implemented something similar? Are there pit-falls to this 
approach I should be aware of (an exception for invalid data it the 
database is fine)? Do you have a suggestion of a better way to accomplish 
this?

The following simplified psuedo-code seems to do what I am looking for 
(get_db_prep_value should be implemented too).


class JSONField(models.JSONField):

    def __init__(self, serializer_class=None, *args, **kwargs):

    """
    :param serializer_class: a rest framework serializer which will be used to 
deserialize the json data from the database.
        Among other things this may create datetime objects for some fields. Be 
aware that fields not present on the serializer
        may be lost, and if there is invalid data in the database it will raise
    """
    self.serializer_class = serializer_class
    models.TextField.__init__(self, *args, **kwargs)


def to_python(self, value):
    """
    Overrides the django-extensions default to use a Decimal instead of a float
    :param value:
    :return:
    """

    data = json.loads(value)
    if self.serializer_class is not None:

#       Use string names for serializers because they will often reference 
models and this avoid circular imports

module_name, class_name = self.serializer_class.rsplit('.', 1)
serializer_class = getattr(import_module(module_name), class_name)
serializer = serializer_class(data=data)
serializer.is_valid()
data = serializer.validated_data
return data

-- 
You received this message because you are subscribed to the Google Groups 
"Django REST framework" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to