@@ -47,31 +47,36 @@ def get_fields(self, cls=None):
47
47
_declared_fields = OrderedDict ()
48
48
49
49
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 )
51
51
# print(_cls, _current_fields)
52
52
_declared_fields .update (_current_fields )
53
+ for name in _remove_fields :
54
+ del _declared_fields [name ]
53
55
54
56
return _declared_fields
55
57
56
- def get_fields_from_cls (self , cls ):
58
+ def get_fields_from_cls (self , cls , current_fields ):
57
59
"""
58
60
Search fields for one class.
59
61
60
62
:param rest_framework.serializers.Serializer cls: Class for search fields.
63
+ :param collections.OrderedDict current_fields: Current searching fields.
61
64
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]
64
67
65
68
"""
66
- _declared_fields = OrderedDict ()
69
+ _declared_fields , _remove_fields = OrderedDict (), []
67
70
68
71
# Fill storage of fields.
69
72
for name , obj in six .iteritems (cls .__dict__ ):
70
73
if isinstance (obj , Field ):
71
74
_declared_fields [name ] = obj
75
+ elif name in current_fields :
76
+ _remove_fields .append (name )
72
77
73
78
# Forward storage of fields to the class itself.
74
- return _declared_fields
79
+ return _declared_fields , _remove_fields
75
80
76
81
77
82
class BaseSerializerMeta (type ):
0 commit comments