@@ -71,28 +71,28 @@ class PolymorphicModelBase(ModelBase):
7171 """
7272
7373 def __new__ (cls , model_name , bases , attrs , ** kwargs ):
74- # create new model
75- new_class = super ().__new__ (cls , model_name , bases , attrs , ** kwargs )
74+ # skip special setup for PolymorphicModel itself
75+ if attrs .pop ("_meta_skip" , False ):
76+ return super ().__new__ (cls , model_name , bases , attrs , ** kwargs )
7677
77- if new_class ._meta .base_manager_name is None :
78- # by default, use polymorphic manager as the base manager
79- new_class ._meta .base_manager_name = new_class ._meta .default_manager_name or "objects"
78+ from .models import PolymorphicModel
8079
81- # ensure base_manager is a plain PolymorphicManager by resetting it if it
82- # was not explicitly set and it defaults to a changed default_manager
83- # the base class manager determination logic is complex enough that we prefer
84- # to observe its application and correct rather than preempting it
85- if (
86- type (new_class ._meta .default_manager ) is not PolymorphicManager
87- and new_class ._meta .base_manager is new_class ._meta .default_manager
80+ new_class = super ().__new__ (cls , model_name , bases , attrs , ** kwargs )
81+
82+ if not any (
83+ parent ._meta .base_manager_name
84+ for parent in new_class .mro ()
85+ if issubclass (parent , PolymorphicModel )
8886 ):
89- manager = PolymorphicManager ()
90- manager .name = "_base_manager"
91- manager .model = new_class
92- manager .auto_created = True
93- new_class ._meta .base_manager_name = None
94- # write new manager to property cache
95- new_class ._meta .__dict__ ["base_manager" ] = manager
87+ if new_class ._meta .default_manager .__class__ is PolymorphicManager :
88+ new_class ._meta .__dict__ ["base_manager" ] = new_class ._meta .default_manager
89+ else :
90+ manager = PolymorphicManager ()
91+ manager .name = "_base_manager"
92+ manager .model = new_class
93+ manager .auto_created = True
94+ # write new manager to property cache
95+ new_class ._meta .__dict__ ["base_manager" ] = manager
9696
9797 # wrap on_delete handlers of reverse relations back to this model with the
9898 # polymorphic deletion guard
@@ -104,8 +104,6 @@ def __new__(cls, model_name, bases, attrs, **kwargs):
104104
105105 # replace the parent/child descriptors
106106 if new_class ._meta .parents and not (new_class ._meta .abstract or new_class ._meta .proxy ):
107- # PolymorphicModel is guaranteed to be defined here
108- from .models import PolymorphicModel
109107
110108 def replace_inheritance_descriptors (model ):
111109 for super_cls , field_to_super in model ._meta .parents .items ():
0 commit comments