@@ -116,59 +116,91 @@ def load_dump(
116116
117117 with transaction .atomic (using = using ):
118118 connection = connections [using ]
119- models = set ()
120119 with connection .constraint_checks_disabled ():
121- for spec in data ["specs" ]:
122- if objs := objects [spec ["model" ]]:
123- for ds in objs :
124- if ignore_missing_m2m := spec .get ("ignore_missing_m2m" ):
125- for field_name in ignore_missing_m2m :
126- ignore_missing_m2m_data [ds ][
127- field_name
128- ] = ds .m2m_data .pop (field_name , [])
129-
130- # _do_save changes the PK if the model is in
131- # save_as_new_models
132- seen_pks [ds .object ._meta .label_lower ].add (ds .object .pk )
133- _do_save (
134- ds ,
135- pk_map = save_as_new_pk_map ,
136- save_as_new_models = save_as_new_models ,
137- )
138- seen_pks [ds .object ._meta .label_lower ].add (ds .object .pk )
139- models .add (ds .object .__class__ )
140-
141- progress (f"Saved { len (objs )} { spec ['model' ]} objects" )
142-
143- for spec in reversed (data ["specs" ]):
144- if not spec .get ("delete_missing" ):
145- continue
146-
147- queryset = _model_queryset (spec )
148- deleted = queryset .exclude (pk__in = seen_pks [spec ["model" ]]).delete ()
149- if deleted [0 ]:
150- progress (f"Deleted { spec ['model' ]} objects: { deleted } " )
151-
152- pks = pk_cache ()
153- for ds , lists in ignore_missing_m2m_data .items ():
154- for field_name , field_pks in lists .items ():
155- field = ds .object ._meta .get_field (field_name )
156- existing = pks (field .related_model )
157- getattr (ds .object , field_name ).set (set (field_pks ) & existing )
158-
159- table_names = [model ._meta .db_table for model in models ]
160- try :
161- connection .check_constraints (table_names = table_names )
162- except Exception as e :
163- e .args = ("Problem installing fixtures: %s" % e ,)
164- raise
165-
166- sequence_sql = connection .ops .sequence_reset_sql (no_style (), models )
167- if sequence_sql :
168- progress ("Resetting sequences" )
169- with connection .cursor () as cursor :
170- for line in sequence_sql :
171- cursor .execute (line )
120+ models = set ()
121+ _load_dump (
122+ data ,
123+ objects ,
124+ progress ,
125+ seen_pks ,
126+ save_as_new_pk_map ,
127+ save_as_new_models ,
128+ ignore_missing_m2m_data ,
129+ models ,
130+ )
131+ _finalize (
132+ progress ,
133+ connection ,
134+ models ,
135+ )
136+
137+
138+ def _load_dump (
139+ data ,
140+ objects ,
141+ progress ,
142+ seen_pks ,
143+ save_as_new_pk_map ,
144+ save_as_new_models ,
145+ ignore_missing_m2m_data ,
146+ models ,
147+ ):
148+ for spec in data ["specs" ]:
149+ if objs := objects [spec ["model" ]]:
150+ for ds in objs :
151+ for field_name in spec .get ("ignore_missing_m2m" , ()):
152+ ignore_missing_m2m_data [ds ][field_name ] = ds .m2m_data .pop (
153+ field_name , []
154+ )
155+
156+ # _do_save changes the PK if the model is in
157+ # save_as_new_models
158+ seen_pks [ds .object ._meta .label_lower ].add (ds .object .pk )
159+ _do_save (
160+ ds ,
161+ pk_map = save_as_new_pk_map ,
162+ save_as_new_models = save_as_new_models ,
163+ )
164+ seen_pks [ds .object ._meta .label_lower ].add (ds .object .pk )
165+ models .add (ds .object .__class__ )
166+
167+ progress (f"Saved { len (objs )} { spec ['model' ]} objects" )
168+
169+ for spec in reversed (data ["specs" ]):
170+ if not spec .get ("delete_missing" ):
171+ continue
172+
173+ queryset = _model_queryset (spec )
174+ deleted = queryset .exclude (pk__in = seen_pks [spec ["model" ]]).delete ()
175+ if deleted [0 ]:
176+ progress (f"Deleted { spec ['model' ]} objects: { deleted } " )
177+
178+ pks = pk_cache ()
179+ for ds , lists in ignore_missing_m2m_data .items ():
180+ for field_name , field_pks in lists .items ():
181+ field = ds .object ._meta .get_field (field_name )
182+ existing = pks (field .related_model )
183+ getattr (ds .object , field_name ).set (set (field_pks ) & existing )
184+
185+
186+ def _finalize (
187+ progress ,
188+ connection ,
189+ models ,
190+ ):
191+ table_names = [model ._meta .db_table for model in models ]
192+ try :
193+ connection .check_constraints (table_names = table_names )
194+ except Exception as e :
195+ e .args = ("Problem installing fixtures: %s" % e ,)
196+ raise
197+
198+ sequence_sql = connection .ops .sequence_reset_sql (no_style (), models )
199+ if sequence_sql :
200+ progress ("Resetting sequences" )
201+ with connection .cursor () as cursor :
202+ for line in sequence_sql :
203+ cursor .execute (line )
172204
173205
174206def pk_cache ():
0 commit comments