Commit b4dd4d4b authored by Malcolm Tredinnick's avatar Malcolm Tredinnick
Browse files

Fixed #3163 -- Add a "Meta.managed" option to models.

This allows a model to be defined which is not subject to database table
creation and removal. Useful for models that sit over existing tables or
database views.

Thanks to Alexander Myodov, Wolfgang Kriesing and Ryan Kelly for the bulk of
this patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10008 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 98710a5a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -297,6 +297,7 @@ answer newbie questions, and generally made Django that much better:
    James Murty
    msundstr
    Robert Myers <myer0052@gmail.com>
    Alexander Myodov <alex@myodov.com>
    Nebojša Dorđević
    Doug Napoleone <doug@dougma.com>
    Gopal Narayanan <gopastro@gmail.com>
+1 −1
Original line number Diff line number Diff line
@@ -71,7 +71,7 @@ class Command(NoArgsCommand):
                    if refto in seen_models:
                        sql.extend(connection.creation.sql_for_pending_references(refto, self.style, pending_references))
                sql.extend(connection.creation.sql_for_pending_references(model, self.style, pending_references))
                if verbosity >= 1:
                if verbosity >= 1 and sql:
                    print "Creating table %s" % model._meta.db_table
                for statement in sql:
                    cursor.execute(statement)
+4 −0
Original line number Diff line number Diff line
@@ -450,6 +450,8 @@ class BaseDatabaseIntrospection(object):
        tables = set()
        for app in models.get_apps():
            for model in models.get_models(app):
                if not model._meta.managed:
                    continue
                tables.add(model._meta.db_table)
                tables.update([f.m2m_db_table() for f in model._meta.local_many_to_many])
        if only_existing:
@@ -476,6 +478,8 @@ class BaseDatabaseIntrospection(object):

        for app in apps:
            for model in models.get_models(app):
                if not model._meta.managed:
                    continue
                for f in model._meta.local_fields:
                    if isinstance(f, models.AutoField):
                        sequence_list.append({'table': model._meta.db_table, 'column': f.column})
+10 −0
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ class BaseDatabaseCreation(object):
        from django.db import models

        opts = model._meta
        if not opts.managed:
            return [], {}
        final_output = []
        table_output = []
        pending_references = {}
@@ -112,6 +114,8 @@ class BaseDatabaseCreation(object):
        "Returns any ALTER TABLE statements to add constraints after the fact."
        from django.db.backends.util import truncate_name

        if not model._meta.managed:
            return []
        qn = self.connection.ops.quote_name
        final_output = []
        opts = model._meta
@@ -225,6 +229,8 @@ class BaseDatabaseCreation(object):

    def sql_indexes_for_model(self, model, style):
        "Returns the CREATE INDEX SQL statements for a single model"
        if not model._meta.managed:
            return []
        output = []
        for f in model._meta.local_fields:
            output.extend(self.sql_indexes_for_field(model, f, style))
@@ -255,6 +261,8 @@ class BaseDatabaseCreation(object):

    def sql_destroy_model(self, model, references_to_delete, style):
        "Return the DROP TABLE and restraint dropping statements for a single model"
        if not model._meta.managed:
            return []
        # Drop the table now
        qn = self.connection.ops.quote_name
        output = ['%s %s;' % (style.SQL_KEYWORD('DROP TABLE'),
@@ -271,6 +279,8 @@ class BaseDatabaseCreation(object):
    def sql_remove_table_constraints(self, model, references_to_delete, style):
        from django.db.backends.util import truncate_name

        if not model._meta.managed:
            return []
        output = []
        qn = self.connection.ops.quote_name
        for rel_class, f in references_to_delete[model]:
+2 −1
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ get_verbose_name = lambda class_name: re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|
DEFAULT_NAMES = ('verbose_name', 'db_table', 'ordering',
                 'unique_together', 'permissions', 'get_latest_by',
                 'order_with_respect_to', 'app_label', 'db_tablespace',
                 'abstract')
                 'abstract', 'managed')

class Options(object):
    def __init__(self, meta, app_label=None):
@@ -42,6 +42,7 @@ class Options(object):
        self.pk = None
        self.has_auto_field, self.auto_field = False, None
        self.abstract = False
        self.managed = True
        self.parents = SortedDict()
        self.duplicate_targets = {}
        # Managers that have been inherited from abstract base classes. These
Loading