@@ -187,11 +187,12 @@ def __new__(cls, name, bases, attrs):
187187 serializer : serializer .Meta .model for serializer in polymorphic_serializers }
188188 model_to_serializer = {
189189 serializer .Meta .model : serializer for serializer in polymorphic_serializers }
190- type_to_model = {
191- get_resource_type_from_model (model ): model for model in model_to_serializer .keys ()}
190+ type_to_serializer = {
191+ get_resource_type_from_serializer (serializer ): serializer for
192+ serializer in polymorphic_serializers }
192193 setattr (new_class , '_poly_serializer_model_map' , serializer_to_model )
193194 setattr (new_class , '_poly_model_serializer_map' , model_to_serializer )
194- setattr (new_class , '_poly_type_model_map ' , type_to_model )
195+ setattr (new_class , '_poly_type_serializer_map ' , type_to_serializer )
195196 return new_class
196197
197198
@@ -213,51 +214,62 @@ def get_fields(self):
213214 raise Exception ("Cannot get fields from a polymorphic serializer given a queryset" )
214215 return super (PolymorphicModelSerializer , self ).get_fields ()
215216
216- def get_polymorphic_serializer_for_instance (self , instance ):
217+ @classmethod
218+ def get_polymorphic_serializer_for_instance (cls , instance ):
217219 """
218220 Return the polymorphic serializer associated with the given instance/model.
219221 Raise `NotImplementedError` if no serializer is found for the given model. This usually
220222 means that a serializer is missing in the class's `polymorphic_serializers` attribute.
221223 """
222224 try :
223- return self ._poly_model_serializer_map [instance ._meta .model ]
225+ return cls ._poly_model_serializer_map [instance ._meta .model ]
224226 except KeyError :
225227 raise NotImplementedError (
226228 "No polymorphic serializer has been found for model {}" .format (
227229 instance ._meta .model .__name__ ))
228230
229- def get_polymorphic_model_for_serializer (self , serializer ):
231+ @classmethod
232+ def get_polymorphic_model_for_serializer (cls , serializer ):
230233 """
231234 Return the polymorphic model associated with the given serializer.
232235 Raise `NotImplementedError` if no model is found for the given serializer. This usually
233236 means that a serializer is missing in the class's `polymorphic_serializers` attribute.
234237 """
235238 try :
236- return self ._poly_serializer_model_map [serializer ]
239+ return cls ._poly_serializer_model_map [serializer ]
237240 except KeyError :
238241 raise NotImplementedError (
239242 "No polymorphic model has been found for serializer {}" .format (serializer .__name__ ))
240243
241- def get_polymorphic_model_for_type (self , obj_type ):
244+ @classmethod
245+ def get_polymorphic_serializer_for_type (cls , obj_type ):
242246 """
243- Return the polymorphic model associated with the given type.
244- Raise `NotImplementedError` if no model is found for the given type. This usually
247+ Return the polymorphic serializer associated with the given type.
248+ Raise `NotImplementedError` if no serializer is found for the given type. This usually
245249 means that a serializer is missing in the class's `polymorphic_serializers` attribute.
246250 """
247251 try :
248- return self . _poly_type_model_map [obj_type ]
252+ return cls . _poly_type_serializer_map [obj_type ]
249253 except KeyError :
250254 raise NotImplementedError (
251- "No polymorphic model has been found for type {}" .format (obj_type ))
255+ "No polymorphic serializer has been found for type {}" .format (obj_type ))
252256
253- def get_polymorphic_serializer_for_type (self , obj_type ):
257+ @classmethod
258+ def get_polymorphic_model_for_type (cls , obj_type ):
254259 """
255- Return the polymorphic serializer associated with the given type.
256- Raise `NotImplementedError` if no serializer is found for the given type. This usually
260+ Return the polymorphic model associated with the given type.
261+ Raise `NotImplementedError` if no model is found for the given type. This usually
257262 means that a serializer is missing in the class's `polymorphic_serializers` attribute.
258263 """
259- return self .get_polymorphic_serializer_for_instance (
260- self .get_polymorphic_model_for_type (obj_type ))
264+ return cls .get_polymorphic_model_for_serializer (
265+ cls .get_polymorphic_serializer_for_type (obj_type ))
266+
267+ @classmethod
268+ def get_polymorphic_types (cls ):
269+ """
270+ Return the list of accepted types.
271+ """
272+ return cls ._poly_type_serializer_map .keys ()
261273
262274 def to_representation (self , instance ):
263275 """
@@ -272,10 +284,10 @@ def to_internal_value(self, data):
272284 appropriate polymorphic serializer and use this to handle internal value.
273285 """
274286 received_type = data .get ('type' )
275- expected_types = self ._poly_type_model_map . keys ()
287+ expected_types = self .get_polymorphic_types ()
276288 if received_type not in expected_types :
277289 raise Conflict (
278- 'Incorrect relation type. Expected on of {expected_types}, '
290+ 'Incorrect relation type. Expected on of [ {expected_types}] , '
279291 'received {received_type}.' .format (
280292 expected_types = ', ' .join (expected_types ), received_type = received_type ))
281293 serializer_class = self .get_polymorphic_serializer_for_type (received_type )
0 commit comments