1
+ import warnings
2
+
1
3
import inflection
2
4
from django .core .exceptions import ObjectDoesNotExist
3
5
from django .db .models .query import QuerySet
@@ -117,8 +119,41 @@ def validate_path(serializer_class, field_path, path):
117
119
super (IncludedResourcesValidationMixin , self ).__init__ (* args , ** kwargs )
118
120
119
121
122
+ class SerializerMetaclass (SerializerMetaclass ):
123
+
124
+ @classmethod
125
+ def _get_declared_fields (cls , bases , attrs ):
126
+ fields = super ()._get_declared_fields (bases , attrs )
127
+ setting_name = 'JSON_API_SERIALIZE_NESTED_SERIALIZERS_AS_ATTRIBUTE'
128
+ for field_name , field in fields .items ():
129
+ if isinstance (field , BaseSerializer ) and \
130
+ not json_api_settings .SERIALIZE_NESTED_SERIALIZERS_AS_ATTRIBUTE and \
131
+ not hasattr (json_api_settings .user_settings , setting_name ):
132
+ clazz = '{}.{}' .format (attrs ['__module__' ], attrs ['__qualname__' ])
133
+ if isinstance (field , ListSerializer ):
134
+ nested_class = type (field .child ).__name__
135
+ else :
136
+ nested_class = type (field ).__name__
137
+
138
+ warnings .warn (DeprecationWarning (
139
+ "Rendering nested serializers in relations by default is deprecated and will "
140
+ "be changed in future releases. Please, use ResourceRelatedField instead of "
141
+ "{} in serializer {} or set JSON_API_SERIALIZE_NESTED_SERIALIZERS_AS_ATTRIBUTE"
142
+ " to False" .format (nested_class , clazz )))
143
+ return fields
144
+
145
+
146
+ # If user imports serializer from here we can catch class definition and check
147
+ # nested serializers for depricated use. Probably it is not bad idea to add
148
+ # sparse and included mixins to this definition, in case people want to use
149
+ # DRF-JA without models underlying.
150
+ class Serializer (Serializer , metaclass = SerializerMetaclass ):
151
+ pass
152
+
153
+
120
154
class HyperlinkedModelSerializer (
121
- IncludedResourcesValidationMixin , SparseFieldsetsMixin , HyperlinkedModelSerializer
155
+ IncludedResourcesValidationMixin , SparseFieldsetsMixin , HyperlinkedModelSerializer ,
156
+ metaclass = SerializerMetaclass
122
157
):
123
158
"""
124
159
A type of `ModelSerializer` that uses hyperlinked relationships instead
@@ -134,7 +169,8 @@ class HyperlinkedModelSerializer(
134
169
"""
135
170
136
171
137
- class ModelSerializer (IncludedResourcesValidationMixin , SparseFieldsetsMixin , ModelSerializer ):
172
+ class ModelSerializer (IncludedResourcesValidationMixin , SparseFieldsetsMixin , ModelSerializer ,
173
+ metaclass = SerializerMetaclass ):
138
174
"""
139
175
A `ModelSerializer` is just a regular `Serializer`, except that:
140
176
0 commit comments