Source code for rest_easy.models
# coding: utf-8
"""
This module provides useful model mixins and global functions.
Its contents can be used to serialize a model or find proper serializer/deserialize data via a registered serializer.
"""
from __future__ import unicode_literals
from rest_easy.exceptions import RestEasyException
from rest_easy.registers import serializer_register
__all__ = ['SerializableMixin', 'get_serializer', 'deserialize_data']
[docs]class SerializableMixin(object):
"""
This mixin provides serializing functionality to Django models.
The serializing is achieved thanks to serializers registered in
:class:`rest_easy.registers.SerializerRegister`. A proper serializer based on model and provided
schema is obtained from the register and the serialization process is delegated to it.
Usage:
```python
from users.models import User
serializer = User.get_serializer(User.default_schema)
```
Or:
```python
data = User.objects.all()[0].serialize()
```
"""
default_schema = 'default'
[docs] @classmethod
def get_serializer(cls, schema):
"""
Get correct serializer for this model and given schema,
Utilizes :class:`rest_easy.registers.SerializerRegister` to obtain correct serializer class.
:param schema: schema to be used for serialization.
:return: serializer class.
"""
name = serializer_register.get_name(cls, schema)
return serializer_register.lookup(name)
[docs] def serialize(self, schema=None):
"""
Serialize the model using given or default schema.
:param schema: schema to be used for serialization or self.default_schema
:return: serialized data (a dict).
"""
serializer = self.get_serializer(schema or self.default_schema)
if not serializer:
raise RestEasyException('No serializer found for model {} schema {}'.format(self.__class__, schema))
return serializer(self).data
[docs]def get_serializer(data):
"""
Get correct serializer for dict-like data.
This introspects model and schema fields of the data and passes them to
:class:`rest_easy.registers.SerializerRegister`.
:param data: dict-like object.
:return: serializer class.
"""
if 'model' not in data or 'schema' not in data:
raise RestEasyException('Both model and schema must be provided in data~.')
serializer = serializer_register.lookup(serializer_register.get_name(data['model'], data['schema']))
if not serializer:
raise RestEasyException('No serializer found for model {} schema {}'.format(data['model'], data['schema']))
return serializer
[docs]def deserialize_data(data):
"""
Deserialize dict-like data.
This function will obtain correct serializer from :class:`rest_easy.registers.SerializerRegister`
using :func:`rest_easy.models.get_serializer`.
:param data: dict-like object or json string.
:return: Deserialized, validated data.
"""
serializer = get_serializer(data)(data=data)
serializer.is_valid(raise_exception=True)
return serializer.validated_data