@@ -54,7 +54,7 @@ def __init__(self, meta):
54
54
self .verbose_name_plural = None
55
55
self .abstract = False
56
56
self .doc_group = None
57
- self .type_field = DEFAULT_TYPE_FIELD
57
+ self .type_field = NotProvided
58
58
self .key_field_names = None
59
59
self .field_sorting = NotProvided
60
60
self .user_data = None
@@ -292,14 +292,18 @@ def __new__(mcs, name, bases, attrs):
292
292
new_meta = mcs .meta_options (meta )
293
293
new_class .add_to_class ("_meta" , new_meta )
294
294
295
- # Namespace is inherited
295
+ # Namespace is inherited and default if not provided
296
296
if base_meta and new_meta .name_space is NotProvided :
297
297
new_meta .name_space = base_meta .name_space
298
-
299
- # Generate a namespace if one is not provided
300
298
if new_meta .name_space is NotProvided :
301
299
new_meta .name_space = module
302
300
301
+ # Type field is inherited and default if not provided
302
+ if base_meta and new_meta .type_field is NotProvided :
303
+ new_meta .type_field = base_meta .type_field
304
+ if new_meta .type_field is NotProvided :
305
+ new_meta .type_field = DEFAULT_TYPE_FIELD
306
+
303
307
# Key field is inherited
304
308
if base_meta and new_meta .key_field_names is None :
305
309
new_meta .key_field_names = base_meta .key_field_names
@@ -570,9 +574,9 @@ class Resource(six.with_metaclass(ResourceType, ResourceBase)):
570
574
def resolve_resource_type (resource ):
571
575
if isinstance (resource , type ) and issubclass (resource , ResourceBase ):
572
576
meta = getmeta (resource )
573
- return meta .resource_name , meta .type_field
577
+ return meta .resource_name , meta .type_field , meta . name_space
574
578
else :
575
- return resource , DEFAULT_TYPE_FIELD
579
+ return resource , DEFAULT_TYPE_FIELD , ""
576
580
577
581
578
582
def create_resource_from_iter (
@@ -647,11 +651,16 @@ def _resolve_type_from_resource(data, resource):
647
651
else :
648
652
resources = [resolve_resource_type (resource )]
649
653
650
- for resource_name , type_field in resources :
654
+ for resource_name , type_field , name_space in resources :
651
655
# See if the input includes a type field and check it's registered
652
656
document_resource_name = data .get (type_field , None )
653
657
if document_resource_name :
654
658
resource_type = registration .get_resource (document_resource_name )
659
+ # Fall back to try applying a prefix
660
+ if not resource_type and name_space :
661
+ resource_type = registration .get_resource (
662
+ "{}.{}" .format (name_space , document_resource_name )
663
+ )
655
664
else :
656
665
resource_type = registration .get_resource (resource_name )
657
666
@@ -702,9 +711,12 @@ def _resolve_type_from_data(data):
702
711
703
712
704
713
def create_resource_from_dict (
705
- d , resource = None , full_clean = True , copy_dict = True , default_to_not_provided = False
714
+ d , # type: Dict[str, Any]
715
+ resource = None , # type: Type[R]
716
+ full_clean = True , # type: bool
717
+ copy_dict = True , # type: bool
718
+ default_to_not_provided = False , # type: bool
706
719
):
707
- # type: (Dict[str, Any], Type[R], bool, bool, bool) -> R
708
720
"""
709
721
Create a resource from a dict.
710
722
@@ -764,7 +776,11 @@ def create_resource_from_dict(
764
776
765
777
766
778
def build_object_graph (
767
- d , resource = None , full_clean = True , copy_dict = True , default_to_not_supplied = False
779
+ d , # type: Dict[str, Any]
780
+ resource = None , # type: Type[R]
781
+ full_clean = True , # type: bool
782
+ copy_dict = True , # type: bool
783
+ default_to_not_supplied = False , # type: bool
768
784
):
769
785
"""
770
786
Generate an object graph from a dict
0 commit comments