Skip to content

Instantly share code, notes, and snippets.

@Cariosvertel
Last active April 27, 2017 22:26
Show Gist options
  • Save Cariosvertel/97b73593684dab3765d5d5c512f9233f to your computer and use it in GitHub Desktop.
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
# 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