1010from .utils import OperationCollector
1111
1212
13+ def ignore_embedded_models (func ):
14+ """
15+ Make a SchemaEditor method a no-op if model is an EmbeddedModel (unless
16+ parent_model isn't None, in which case this is a valid recursive operation
17+ such as adding an index on an embedded model's field).
18+ """
19+
20+ def wrapper (self , model , * args , ** kwargs ):
21+ parent_model = kwargs .get ("parent_model" )
22+ from .models import EmbeddedModel
23+
24+ if issubclass (model , EmbeddedModel ) and parent_model is None :
25+ return
26+ func (self , model , * args , ** kwargs )
27+
28+ return wrapper
29+
30+
1331class DatabaseSchemaEditor (BaseDatabaseSchemaEditor ):
1432 def get_collection (self , name ):
1533 if self .collect_sql :
@@ -22,6 +40,7 @@ def get_database(self):
2240 return self .connection .get_database ()
2341
2442 @wrap_database_errors
43+ @ignore_embedded_models
2544 def create_model (self , model ):
2645 self .get_database ().create_collection (model ._meta .db_table )
2746 self ._create_model_indexes (model )
@@ -75,13 +94,15 @@ def _create_model_indexes(self, model, column_prefix="", parent_model=None):
7594 for index in model ._meta .indexes :
7695 self .add_index (model , index , column_prefix = column_prefix , parent_model = parent_model )
7796
97+ @ignore_embedded_models
7898 def delete_model (self , model ):
7999 # Delete implicit M2m tables.
80100 for field in model ._meta .local_many_to_many :
81101 if field .remote_field .through ._meta .auto_created :
82102 self .delete_model (field .remote_field .through )
83103 self .get_collection (model ._meta .db_table ).drop ()
84104
105+ @ignore_embedded_models
85106 def add_field (self , model , field ):
86107 # Create implicit M2M tables.
87108 if field .many_to_many and field .remote_field .through ._meta .auto_created :
@@ -103,6 +124,7 @@ def add_field(self, model, field):
103124 elif self ._field_should_have_unique (field ):
104125 self ._add_field_unique (model , field )
105126
127+ @ignore_embedded_models
106128 def _alter_field (
107129 self ,
108130 model ,
@@ -149,6 +171,7 @@ def _alter_field(
149171 if not old_field_unique and new_field_unique :
150172 self ._add_field_unique (model , new_field )
151173
174+ @ignore_embedded_models
152175 def remove_field (self , model , field ):
153176 # Remove implicit M2M tables.
154177 if field .many_to_many and field .remote_field .through ._meta .auto_created :
@@ -210,6 +233,7 @@ def _remove_model_indexes(self, model, column_prefix="", parent_model=None):
210233 for index in model ._meta .indexes :
211234 self .remove_index (parent_model or model , index )
212235
236+ @ignore_embedded_models
213237 def alter_index_together (self , model , old_index_together , new_index_together , column_prefix = "" ):
214238 olds = {tuple (fields ) for fields in old_index_together }
215239 news = {tuple (fields ) for fields in new_index_together }
@@ -222,6 +246,7 @@ def alter_index_together(self, model, old_index_together, new_index_together, co
222246 for field_names in news .difference (olds ):
223247 self ._add_composed_index (model , field_names , column_prefix = column_prefix )
224248
249+ @ignore_embedded_models
225250 def alter_unique_together (
226251 self , model , old_unique_together , new_unique_together , column_prefix = "" , parent_model = None
227252 ):
@@ -249,6 +274,7 @@ def alter_unique_together(
249274 model , constraint , parent_model = parent_model , column_prefix = column_prefix
250275 )
251276
277+ @ignore_embedded_models
252278 def add_index (
253279 self , model , index , * , field = None , unique = False , column_prefix = "" , parent_model = None
254280 ):
@@ -302,6 +328,7 @@ def _add_field_index(self, model, field, *, column_prefix=""):
302328 index .name = self ._create_index_name (model ._meta .db_table , [column_prefix + field .column ])
303329 self .add_index (model , index , field = field , column_prefix = column_prefix )
304330
331+ @ignore_embedded_models
305332 def remove_index (self , model , index ):
306333 if index .contains_expressions :
307334 return
@@ -355,6 +382,7 @@ def _remove_field_index(self, model, field, column_prefix=""):
355382 )
356383 collection .drop_index (index_names [0 ])
357384
385+ @ignore_embedded_models
358386 def add_constraint (self , model , constraint , field = None , column_prefix = "" , parent_model = None ):
359387 if isinstance (constraint , UniqueConstraint ) and self ._unique_supported (
360388 condition = constraint .condition ,
@@ -384,6 +412,7 @@ def _add_field_unique(self, model, field, column_prefix=""):
384412 constraint = UniqueConstraint (fields = [field .name ], name = name )
385413 self .add_constraint (model , constraint , field = field , column_prefix = column_prefix )
386414
415+ @ignore_embedded_models
387416 def remove_constraint (self , model , constraint ):
388417 if isinstance (constraint , UniqueConstraint ) and self ._unique_supported (
389418 condition = constraint .condition ,
@@ -417,6 +446,7 @@ def _remove_field_unique(self, model, field, column_prefix=""):
417446 )
418447 self .get_collection (model ._meta .db_table ).drop_index (constraint_names [0 ])
419448
449+ @ignore_embedded_models
420450 def alter_db_table (self , model , old_db_table , new_db_table ):
421451 if old_db_table == new_db_table :
422452 return
0 commit comments