1010from .utils import OperationCollector
1111
1212
13+ def ignore_embedded_models (func ):
14+ """Make a SchemaEditor a no-op if model is an EmbeddedModel."""
15+
16+ def wrapper (self , model , * args , ** kwargs ):
17+ # If parent_model isn't None, this is a valid recursive operation.
18+ parent_model = kwargs .get ("parent_model" )
19+ from .models import EmbeddedModel
20+
21+ if parent_model is None and issubclass (model , EmbeddedModel ):
22+ return
23+ func (self , model , * args , ** kwargs )
24+
25+ return wrapper
26+
27+
1328class DatabaseSchemaEditor (BaseDatabaseSchemaEditor ):
1429 def get_collection (self , name ):
1530 if self .collect_sql :
@@ -22,6 +37,7 @@ def get_database(self):
2237 return self .connection .get_database ()
2338
2439 @wrap_database_errors
40+ @ignore_embedded_models
2541 def create_model (self , model ):
2642 self .get_database ().create_collection (model ._meta .db_table )
2743 self ._create_model_indexes (model )
@@ -75,13 +91,15 @@ def _create_model_indexes(self, model, column_prefix="", parent_model=None):
7591 for index in model ._meta .indexes :
7692 self .add_index (model , index , column_prefix = column_prefix , parent_model = parent_model )
7793
94+ @ignore_embedded_models
7895 def delete_model (self , model ):
7996 # Delete implicit M2m tables.
8097 for field in model ._meta .local_many_to_many :
8198 if field .remote_field .through ._meta .auto_created :
8299 self .delete_model (field .remote_field .through )
83100 self .get_collection (model ._meta .db_table ).drop ()
84101
102+ @ignore_embedded_models
85103 def add_field (self , model , field ):
86104 # Create implicit M2M tables.
87105 if field .many_to_many and field .remote_field .through ._meta .auto_created :
@@ -103,6 +121,7 @@ def add_field(self, model, field):
103121 elif self ._field_should_have_unique (field ):
104122 self ._add_field_unique (model , field )
105123
124+ @ignore_embedded_models
106125 def _alter_field (
107126 self ,
108127 model ,
@@ -149,6 +168,7 @@ def _alter_field(
149168 if not old_field_unique and new_field_unique :
150169 self ._add_field_unique (model , new_field )
151170
171+ @ignore_embedded_models
152172 def remove_field (self , model , field ):
153173 # Remove implicit M2M tables.
154174 if field .many_to_many and field .remote_field .through ._meta .auto_created :
@@ -210,6 +230,7 @@ def _remove_model_indexes(self, model, column_prefix="", parent_model=None):
210230 for index in model ._meta .indexes :
211231 self .remove_index (parent_model or model , index )
212232
233+ @ignore_embedded_models
213234 def alter_index_together (self , model , old_index_together , new_index_together , column_prefix = "" ):
214235 olds = {tuple (fields ) for fields in old_index_together }
215236 news = {tuple (fields ) for fields in new_index_together }
@@ -222,6 +243,7 @@ def alter_index_together(self, model, old_index_together, new_index_together, co
222243 for field_names in news .difference (olds ):
223244 self ._add_composed_index (model , field_names , column_prefix = column_prefix )
224245
246+ @ignore_embedded_models
225247 def alter_unique_together (
226248 self , model , old_unique_together , new_unique_together , column_prefix = "" , parent_model = None
227249 ):
@@ -249,6 +271,7 @@ def alter_unique_together(
249271 model , constraint , parent_model = parent_model , column_prefix = column_prefix
250272 )
251273
274+ @ignore_embedded_models
252275 def add_index (
253276 self , model , index , * , field = None , unique = False , column_prefix = "" , parent_model = None
254277 ):
@@ -302,6 +325,7 @@ def _add_field_index(self, model, field, *, column_prefix=""):
302325 index .name = self ._create_index_name (model ._meta .db_table , [column_prefix + field .column ])
303326 self .add_index (model , index , field = field , column_prefix = column_prefix )
304327
328+ @ignore_embedded_models
305329 def remove_index (self , model , index ):
306330 if index .contains_expressions :
307331 return
@@ -355,6 +379,7 @@ def _remove_field_index(self, model, field, column_prefix=""):
355379 )
356380 collection .drop_index (index_names [0 ])
357381
382+ @ignore_embedded_models
358383 def add_constraint (self , model , constraint , field = None , column_prefix = "" , parent_model = None ):
359384 if isinstance (constraint , UniqueConstraint ) and self ._unique_supported (
360385 condition = constraint .condition ,
@@ -384,6 +409,7 @@ def _add_field_unique(self, model, field, column_prefix=""):
384409 constraint = UniqueConstraint (fields = [field .name ], name = name )
385410 self .add_constraint (model , constraint , field = field , column_prefix = column_prefix )
386411
412+ @ignore_embedded_models
387413 def remove_constraint (self , model , constraint ):
388414 if isinstance (constraint , UniqueConstraint ) and self ._unique_supported (
389415 condition = constraint .condition ,
@@ -417,6 +443,7 @@ def _remove_field_unique(self, model, field, column_prefix=""):
417443 )
418444 self .get_collection (model ._meta .db_table ).drop_index (constraint_names [0 ])
419445
446+ @ignore_embedded_models
420447 def alter_db_table (self , model , old_db_table , new_db_table ):
421448 if old_db_table == new_db_table :
422449 return
0 commit comments