@@ -47,31 +47,36 @@ def get_fields(self, cls=None):
4747 _declared_fields = OrderedDict ()
4848
4949 for _cls in reversed ((cls or self .cls ).__mro__ ):
50- _current_fields = self .get_fields_from_cls (_cls )
50+ _current_fields , _remove_fields = self .get_fields_from_cls (_cls , _declared_fields )
5151 # print(_cls, _current_fields)
5252 _declared_fields .update (_current_fields )
53+ for name in _remove_fields :
54+ del _declared_fields [name ]
5355
5456 return _declared_fields
5557
56- def get_fields_from_cls (self , cls ):
58+ def get_fields_from_cls (self , cls , current_fields ):
5759 """
5860 Search fields for one class.
5961
6062 :param rest_framework.serializers.Serializer cls: Class for search fields.
63+ :param collections.OrderedDict current_fields: Current searching fields.
6164
62- :return: Dict fields for class.
63- :rtype: collections.OrderedDict
65+ :return: Dict fields for class. Tuple[new_fields, remove_fields]
66+ :rtype: Tuple[ collections.OrderedDict, list]
6467
6568 """
66- _declared_fields = OrderedDict ()
69+ _declared_fields , _remove_fields = OrderedDict (), []
6770
6871 # Fill storage of fields.
6972 for name , obj in six .iteritems (cls .__dict__ ):
7073 if isinstance (obj , Field ):
7174 _declared_fields [name ] = obj
75+ elif name in current_fields :
76+ _remove_fields .append (name )
7277
7378 # Forward storage of fields to the class itself.
74- return _declared_fields
79+ return _declared_fields , _remove_fields
7580
7681
7782class BaseSerializerMeta (type ):
0 commit comments