Advertisement
Guest User

Untitled

a guest
Apr 18th, 2013
464
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.64 KB | None | 0 0
  1. """
  2. PostHyperlinkedModelSerializer inherits from HyperlinkedModelSerializer
  3. This serializer allows us to add fields that do not belong to the model.
  4.  
  5. The `process_postonly_fields` method should be overriden.
  6. Important: This method is called before the `pre_save` method.
  7.  
  8. Example of usage:
  9.  
  10.    class SomeModelSerializer(PostHyperlinkedModelSerializer):
  11.        field_only_for_post = serializers.CharField()
  12.  
  13.        class Meta:
  14.            model = SomeModel
  15.            fields = ('field1', 'field2', ..., 'field_only_for_post')
  16.            postonly_fields = ('field_only_for_post',)
  17.  
  18.        def process_postonly_fields(self, obj, post_attrs):
  19.            post_only_for_post = post_attrs['post_only_for_post']
  20.            # Process field ...
  21.  
  22. """
  23.  
  24. from rest_framework.serializers import (HyperlinkedModelSerializerOptions,
  25.                                         HyperlinkedModelSerializer)
  26.  
  27.  
  28. class PostHyperlinkedModelSerializerOptions(HyperlinkedModelSerializerOptions):
  29.     """
  30.    Options for PostHyperlinkedModelSerializer
  31.    """
  32.  
  33.     def __init__(self, meta):
  34.         super(PostHyperlinkedModelSerializerOptions, self).__init__(meta)
  35.         self.postonly_fields = getattr(meta, 'postonly_fields', ())
  36.  
  37.  
  38. class PostHyperlinkedModelSerializer(HyperlinkedModelSerializer):
  39.     _options_class = PostHyperlinkedModelSerializerOptions
  40.  
  41.     def to_native(self, obj):
  42.         """
  43.        Serialize objects -> primitives.
  44.        """
  45.         ret = self._dict_class()
  46.         ret.fields = {}
  47.  
  48.         for field_name, field in self.fields.items():
  49.             # Ignore all postonly_fields fron serialization
  50.             if field_name in self.opts.postonly_fields:
  51.                 continue
  52.             field.initialize(parent=self, field_name=field_name)
  53.             key = self.get_field_key(field_name)
  54.             value = field.field_to_native(obj, field_name)
  55.             ret[key] = value
  56.             ret.fields[key] = field
  57.         return ret
  58.  
  59.     def restore_object(self, attrs, instance=None):
  60.         model_attrs, post_attrs = {}, {}
  61.         for attr, value in attrs.iteritems():
  62.             if attr in self.opts.postonly_fields:
  63.                 post_attrs[attr] = value
  64.             else:
  65.                 model_attrs[attr] = value
  66.         obj = super(PostHyperlinkedModelSerializer,
  67.                     self).restore_object(model_attrs, instance)
  68.         # Method to process ignored postonly_fields
  69.         self.process_postonly_fields(obj, post_attrs)
  70.         return obj
  71.  
  72.     def process_postonly_fields(self, obj, post_attrs):
  73.         """
  74.        Placeholder method for processing data sent in POST.
  75.        """
  76.         pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement