diff -urN django-0.9.6/core/management.py django/core/management.py
--- django-0.9.6/core/management.py	2007-10-31 11:44:31.105375000 +0300
+++ django/core/management.py	2007-11-01 23:51:11.334250000 +0300
@@ -206,7 +206,8 @@
     for i, line in enumerate(table_output): # Combine and add commas.
         full_statement.append('    %s%s' % (line, i < len(table_output)-1 and ',' or ''))
     full_statement.append(');')
-    final_output.append('\n'.join(full_statement))
+    if opts.sql_generation_required:
+        final_output.append('\n'.join(full_statement))
 
     return final_output, pending_references
 
@@ -230,10 +231,11 @@
                 # For MySQL, r_name must be unique in the first 64 characters.
                 # So we are careful with character usage here.
                 r_name = '%s_refs_%s_%x' % (r_col, col, abs(hash((r_table, table))))
-                final_output.append(style.SQL_KEYWORD('ALTER TABLE') + ' %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)%s;' % \
-                    (backend.quote_name(r_table), r_name,
-                    backend.quote_name(r_col), backend.quote_name(table), backend.quote_name(col),
-                    backend.get_deferrable_sql()))
+                if rel_opts.sql_generation_required:
+                    final_output.append(style.SQL_KEYWORD('ALTER TABLE') + ' %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)%s;' % \
+                        (backend.quote_name(r_table), r_name,
+                        backend.quote_name(r_col), backend.quote_name(table), backend.quote_name(col),
+                        backend.get_deferrable_sql()))
             del pending_references[model]
     return final_output
 
@@ -312,19 +314,21 @@
     for model in app_models:
         if cursor and model._meta.db_table in table_names:
             # Drop the table now
-            output.append('%s %s;' % (style.SQL_KEYWORD('DROP TABLE'),
-                style.SQL_TABLE(backend.quote_name(model._meta.db_table))))
+            if model._meta.sql_generation_required:
+                output.append('%s %s;' % (style.SQL_KEYWORD('DROP TABLE'),
+                    style.SQL_TABLE(backend.quote_name(model._meta.db_table))))
             if backend.supports_constraints and references_to_delete.has_key(model):
                 for rel_class, f in references_to_delete[model]:
                     table = rel_class._meta.db_table
                     col = f.column
                     r_table = model._meta.db_table
                     r_col = model._meta.get_field(f.rel.field_name).column
-                    output.append('%s %s %s %s;' % \
-                        (style.SQL_KEYWORD('ALTER TABLE'),
-                        style.SQL_TABLE(backend.quote_name(table)),
-                        style.SQL_KEYWORD(backend.get_drop_foreignkey_sql()),
-                        style.SQL_FIELD(backend.quote_name('%s_refs_%s_%x' % (col, r_col, abs(hash((table, r_table))))))))
+                    if rel_class._meta.sql_generation_required:
+                        output.append('%s %s %s %s;' % \
+                            (style.SQL_KEYWORD('ALTER TABLE'),
+                            style.SQL_TABLE(backend.quote_name(table)),
+                            style.SQL_KEYWORD(backend.get_drop_foreignkey_sql()),
+                            style.SQL_FIELD(backend.quote_name('%s_refs_%s_%x' % (col, r_col, abs(hash((table, r_table))))))))
                 del references_to_delete[model]
 
     # Output DROP TABLE statements for many-to-many tables.
@@ -451,15 +455,16 @@
     from django.db import backend
     output = []
 
-    for f in model._meta.fields:
-        if f.db_index:
-            unique = f.unique and 'UNIQUE ' or ''
-            output.append(
-                style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \
-                style.SQL_TABLE('%s_%s' % (model._meta.db_table, f.column)) + ' ' + \
-                style.SQL_KEYWORD('ON') + ' ' + \
-                style.SQL_TABLE(backend.quote_name(model._meta.db_table)) + ' ' + \
-                "(%s);" % style.SQL_FIELD(backend.quote_name(f.column))
+    if model._meta.sql_generation_required:
+        for f in model._meta.fields:
+            if f.db_index:
+                unique = f.unique and 'UNIQUE ' or ''
+                output.append(
+                    style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \
+                    style.SQL_TABLE('%s_%s' % (model._meta.db_table, f.column)) + ' ' + \
+                    style.SQL_KEYWORD('ON') + ' ' + \
+                    style.SQL_TABLE(backend.quote_name(model._meta.db_table)) + ' ' + \
+                    "(%s);" % style.SQL_FIELD(backend.quote_name(f.column))
             )
     return output
 
diff -urN django-0.9.6/db/models/options.py django/db/models/options.py
--- django-0.9.6/db/models/options.py	2007-03-19 14:57:53.000000000 +0300
+++ django/db/models/options.py	2007-11-01 23:51:15.943625000 +0300
@@ -13,7 +13,7 @@
 
 DEFAULT_NAMES = ('verbose_name', 'db_table', 'ordering',
                  'unique_together', 'permissions', 'get_latest_by',
-                 'order_with_respect_to', 'app_label')
+                 'order_with_respect_to', 'app_label', 'sql_generation_required')
 
 class Options(object):
     def __init__(self, meta):
@@ -25,6 +25,7 @@
         self.unique_together =  []
         self.permissions =  []
         self.object_name, self.app_label = None, None
+        self.sql_generation_required = True
         self.get_latest_by = None
         self.order_with_respect_to = None
         self.admin = None
@@ -88,10 +89,10 @@
 
     def __repr__(self):
         return '<Options for %s>' % self.object_name
-        
+
     def __str__(self):
         return "%s.%s" % (self.app_label, self.module_name)
-        
+
     def get_field(self, name, many_to_many=True):
         "Returns the requested field by name. Raises FieldDoesNotExist on error."
         to_search = many_to_many and (self.fields + self.many_to_many) or self.fields
