Last active
April 27, 2017 22:26
-
-
Save Cariosvertel/97b73593684dab3765d5d5c512f9233f to your computer and use it in GitHub Desktop.
[rest_framework serializer] a sample of class definitition #tags: django, rest_framework, serializer, class
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# simple class with no models mappings | |
class LayerAuthSerializer(serializers.Serializer): | |
nonce = serializers.CharField() | |
display_name = serializers.CharField(required=False) | |
avatar_url=serializers.CharField(required=False) | |
# a complex class definition | |
class CreateUserSerializer(serializers.Serializer): | |
""" | |
Serializer for create user request | |
""" | |
email = serializers.CharField(required=True) | |
password = serializers.CharField(required=True) | |
gravatar_url = serializers.CharField(required=False) | |
def create(self, validated_data): | |
# if user has used this number previously to authenticate, | |
# then change validation code and and set number as validated = false | |
user = User.objects.create_user(email=validated_data['email'], password=validated_data['password']) | |
# we detect if user has a profile picture from gravatar | |
gravatar_url = validated_data.pop('gravatar_url', None) | |
if gravatar_url is not None: | |
photo = download_gravatar(gravatar_url) | |
user.profile_avatar = photo | |
user.save() | |
return user | |
def to_internal_value(self, data): | |
super(CreateUserSerializer, self).to_internal_value(data) | |
if not data.get('password'): | |
raise serializers.ValidationError({ | |
'error': 'Password is required', | |
'code' : exception_handler.ERROR_DATA_INCONSISTENCY | |
}) | |
email = data.get('email') | |
if not email: | |
raise serializers.ValidationError({ | |
'error': 'Email is required', | |
'code' : exception_handler.ERROR_DATA_INCONSISTENCY | |
}) | |
return data | |
# custom field serializer | |
from django.contrib.auth.models import User | |
from django.utils.timezone import now | |
from rest_framework import serializers | |
class UserSerializer(serializers.ModelSerializer): | |
days_since_joined = serializers.SerializerMethodField() | |
class Meta: | |
model = User | |
def get_days_since_joined(self, obj): | |
return (now() - obj.date_joined).days | |
# custom field serializer with class | |
class ColorField(serializers.Field): | |
""" | |
Color objects are serialized into 'rgb(#, #, #)' notation. | |
""" | |
def to_representation(self, obj): | |
return "rgb(%d, %d, %d)" % (obj.red, obj.green, obj.blue) | |
def to_internal_value(self, data): | |
data = data.strip('rgb(').rstrip(')') | |
red, green, blue = [int(col) for col in data.split(',')] | |
return Color(red, green, blue) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment