diff options
| -rw-r--r-- | djangorestframework/serializer.py | 10 | ||||
| -rw-r--r-- | djangorestframework/tests/serializer.py | 15 | 
2 files changed, 18 insertions, 7 deletions
diff --git a/djangorestframework/serializer.py b/djangorestframework/serializer.py index 4e1c6b80..43d32b29 100644 --- a/djangorestframework/serializer.py +++ b/djangorestframework/serializer.py @@ -230,12 +230,14 @@ class Serializer(object):          # serialize each required field          for fname in fields:              try: -                if inspect.ismethod(getattr(self, fname, None)) and \ -                        len(inspect.getargspec(getattr(self, fname))[0]) == 2: -                    # check first for a method 'fname' on self first +                # we first check for a method 'fname' on self, +                # 'fname's signature must be 'def fname(self, instance)' +                meth = getattr(self, fname, None) +                if (inspect.ismethod(meth) and +                            len(inspect.getargspec(meth)[0]) == 2):                      obj = meth(instance)                  elif hasattr(instance, '__contains__') and fname in instance: -                    # check for a key 'fname' on the instance +                    # then check for a key 'fname' on the instance                      obj = instance[fname]                  elif hasattr(instance, smart_str(fname)):                      # finally check for an attribute 'fname' on the instance diff --git a/djangorestframework/tests/serializer.py b/djangorestframework/tests/serializer.py index 8e370fa1..7cf9325b 100644 --- a/djangorestframework/tests/serializer.py +++ b/djangorestframework/tests/serializer.py @@ -34,9 +34,7 @@ class TestObjectToData(TestCase):          self.assertEquals(self.serialize(Foo().foo), 1)      def test_datetime(self): -        """ -        datetime objects are left as-is. -        """ +        """datetime objects are left as-is."""          now = datetime.datetime.now()          self.assertEquals(self.serialize(now), now) @@ -121,3 +119,14 @@ class TestFieldNesting(TestCase):          self.assertEqual(SerializerM2().serialize(self.m2), {'field': {'field1': u'foo'}})          self.assertEqual(SerializerM3().serialize(self.m3), {'field': {'field2': u'bar'}}) + +    def test_serializer_unvalid_hook_method(self): +        """ +        Test serializing a model instance with an unvalid hook method on the serializer. +        """ +        class SerializerM2(Serializer): +            fields = ('unvalid_hook', ) +            def unvalid_hook(self): +                return +        self.m2.unvalid_hook = 'bla' +        self.assertEqual(SerializerM2().serialize_model(self.m2), {'unvalid_hook': 'bla'})  | 
