@@ -362,7 +362,8 @@ def extract_included(cls, fields, resource, resource_instance, included_resource
362
362
serializer_fields ,
363
363
serializer_resource ,
364
364
nested_resource_instance ,
365
- resource_type
365
+ resource_type ,
366
+ getattr (serializer , '_poly_force_type_resolution' , False )
366
367
)
367
368
)
368
369
included_data .extend (
@@ -384,7 +385,8 @@ def extract_included(cls, fields, resource, resource_instance, included_resource
384
385
included_data .append (
385
386
cls .build_json_resource_obj (
386
387
serializer_fields , serializer_data ,
387
- relation_instance , relation_type )
388
+ relation_instance , relation_type ,
389
+ getattr (field , '_poly_force_type_resolution' , False ))
388
390
)
389
391
included_data .extend (
390
392
cls .extract_included (
@@ -426,9 +428,10 @@ def extract_root_meta(cls, serializer, resource):
426
428
return data
427
429
428
430
@classmethod
429
- def build_json_resource_obj (cls , fields , resource , resource_instance , resource_name ):
431
+ def build_json_resource_obj (cls , fields , resource , resource_instance , resource_name ,
432
+ force_type_resolution = False ):
430
433
# Determine type from the instance if the underlying model is polymorphic
431
- if isinstance ( resource_instance , utils . POLYMORPHIC_ANCESTORS ) :
434
+ if force_type_resolution :
432
435
resource_name = utils .get_resource_type_from_instance (resource_instance )
433
436
resource_data = [
434
437
('type' , resource_name ),
@@ -512,6 +515,9 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
512
515
# Get the serializer fields
513
516
fields = utils .get_serializer_fields (serializer )
514
517
518
+ # Determine if resource name must be resolved on each instance (polymorphic serializer)
519
+ force_type_resolution = getattr (serializer , '_poly_force_type_resolution' , False )
520
+
515
521
# Extract root meta for any type of serializer
516
522
json_api_meta .update (self .extract_root_meta (serializer , serializer_data ))
517
523
@@ -523,7 +529,7 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
523
529
resource_instance = serializer .instance [position ] # Get current instance
524
530
525
531
json_resource_obj = self .build_json_resource_obj (
526
- fields , resource , resource_instance , resource_name
532
+ fields , resource , resource_instance , resource_name , force_type_resolution
527
533
)
528
534
meta = self .extract_meta (serializer , resource )
529
535
if meta :
@@ -538,7 +544,7 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
538
544
else :
539
545
resource_instance = serializer .instance
540
546
json_api_data = self .build_json_resource_obj (
541
- fields , serializer_data , resource_instance , resource_name
547
+ fields , serializer_data , resource_instance , resource_name , force_type_resolution
542
548
)
543
549
544
550
meta = self .extract_meta (serializer , serializer_data )
0 commit comments