Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """
- PostHyperlinkedModelSerializer inherits from HyperlinkedModelSerializer
- This serializer allows us to add fields that do not belong to the model.
- The `process_postonly_fields` method should be overriden.
- Important: This method is called before the `pre_save` method.
- Example of usage:
- class SomeModelSerializer(PostHyperlinkedModelSerializer):
- field_only_for_post = serializers.CharField()
- class Meta:
- model = SomeModel
- fields = ('field1', 'field2', ..., 'field_only_for_post')
- postonly_fields = ('field_only_for_post',)
- def process_postonly_fields(self, obj, post_attrs):
- post_only_for_post = post_attrs['post_only_for_post']
- # Process field ...
- """
- from rest_framework.serializers import (HyperlinkedModelSerializerOptions,
- HyperlinkedModelSerializer)
- class PostHyperlinkedModelSerializerOptions(HyperlinkedModelSerializerOptions):
- """
- Options for PostHyperlinkedModelSerializer
- """
- def __init__(self, meta):
- super(PostHyperlinkedModelSerializerOptions, self).__init__(meta)
- self.postonly_fields = getattr(meta, 'postonly_fields', ())
- class PostHyperlinkedModelSerializer(HyperlinkedModelSerializer):
- _options_class = PostHyperlinkedModelSerializerOptions
- def to_native(self, obj):
- """
- Serialize objects -> primitives.
- """
- ret = self._dict_class()
- ret.fields = {}
- for field_name, field in self.fields.items():
- # Ignore all postonly_fields fron serialization
- if field_name in self.opts.postonly_fields:
- continue
- field.initialize(parent=self, field_name=field_name)
- key = self.get_field_key(field_name)
- value = field.field_to_native(obj, field_name)
- ret[key] = value
- ret.fields[key] = field
- return ret
- def restore_object(self, attrs, instance=None):
- model_attrs, post_attrs = {}, {}
- for attr, value in attrs.iteritems():
- if attr in self.opts.postonly_fields:
- post_attrs[attr] = value
- else:
- model_attrs[attr] = value
- obj = super(PostHyperlinkedModelSerializer,
- self).restore_object(model_attrs, instance)
- # Method to process ignored postonly_fields
- self.process_postonly_fields(obj, post_attrs)
- return obj
- def process_postonly_fields(self, obj, post_attrs):
- """
- Placeholder method for processing data sent in POST.
- """
- pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement