diff --git a/django/core/management.py b/django/core/management.py index 0c1b5528e2..dd501aa9db 100644 --- a/django/core/management.py +++ b/django/core/management.py @@ -382,6 +382,12 @@ def get_sql_delete(app): if hasattr(backend, 'get_drop_sequence'): output.append(backend.get_drop_sequence("%s_%s" % (model._meta.db_table, f.column))) + # Any post deletion needed? (e.g., DropGeometryColumn() in PostGIS) + for model in app_models: + opts = model._meta + for f in opts.fields: + if hasattr(f, '_post_delete_sql'): + output.append(f._post_delete_sql(style, model._meta.db_table)) app_label = app_models[0]._meta.app_label @@ -417,6 +423,11 @@ def get_custom_sql_for_model(model): app_dir = os.path.normpath(os.path.join(os.path.dirname(models.get_app(model._meta.app_label).__file__), 'sql')) output = [] + # Post-creation SQL should come before any initial SQL data is loaded. + for f in opts.fields: + if hasattr(f, '_post_create_sql'): + output.append(f._post_create_sql(style, model._meta.db_table)) + # Some backends can't execute more than one SQL statement at a time, # so split into separate statements. statements = re.compile(r";[ \t]*$", re.M) @@ -434,10 +445,6 @@ def get_custom_sql_for_model(model): output.append(statement + ";") fp.close() - for f in opts.fields: - if hasattr(f, '_post_create_sql'): - output.append(f._post_create_sql(style, model._meta.db_table)) - return output def get_custom_sql(app): diff --git a/django/db/models/base.py b/django/db/models/base.py index b1c4a43628..21225d2623 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -227,11 +227,12 @@ class Model(object): if not pk_set or not record_exists: field_names = [backend.quote_name(f.column) for f in self._meta.fields if not isinstance(f, AutoField)] db_values = [f.get_db_prep_save(f.pre_save(self, True)) for f in self._meta.fields if not isinstance(f, AutoField)] + placeholders = [f.get_placeholder(f.pre_save(self, True)) for f in self._meta.fields if not isinstance(f, AutoField)] # If the PK has been manually set, respect that. if pk_set: field_names += [f.column for f in self._meta.fields if isinstance(f, AutoField)] db_values += [f.get_db_prep_save(f.pre_save(self, True)) for f in self._meta.fields if isinstance(f, AutoField)] - placeholders = ['%s'] * len(field_names) + placeholders += [f.get_placeholder(f.pre_save(self, True)) for f in self._meta.fields if isinstance(f, AutoField)] if self._meta.order_with_respect_to: field_names.append(backend.quote_name('_order')) # TODO: This assumes the database supports subqueries. diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 14154fd6f7..87a6c63289 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -216,6 +216,10 @@ class Field(object): """ return [name_prefix + self.name] + def get_placeholder(self, value): + "Returns the placeholder substitution string for the field with the given value." + return '%s' + def prepare_field_objs_and_params(self, manipulator, name_prefix): params = {'validator_list': self.validator_list[:]} if self.maxlength and not self.choices: # Don't give SelectFields a maxlength parameter.