Ensure sequences are reset correctly in the presence of swapped models.
This commit is contained in:
parent
e2b6e22f29
commit
8a527dda13
|
@ -319,6 +319,7 @@ class BaseDatabaseWrapper(object):
|
||||||
def make_debug_cursor(self, cursor):
|
def make_debug_cursor(self, cursor):
|
||||||
return util.CursorDebugWrapper(cursor, self)
|
return util.CursorDebugWrapper(cursor, self)
|
||||||
|
|
||||||
|
|
||||||
class BaseDatabaseFeatures(object):
|
class BaseDatabaseFeatures(object):
|
||||||
allows_group_by_pk = False
|
allows_group_by_pk = False
|
||||||
# True if django.db.backend.utils.typecast_timestamp is used on values
|
# True if django.db.backend.utils.typecast_timestamp is used on values
|
||||||
|
@ -776,7 +777,7 @@ class BaseDatabaseOperations(object):
|
||||||
The `style` argument is a Style object as returned by either
|
The `style` argument is a Style object as returned by either
|
||||||
color_style() or no_style() in django.core.management.color.
|
color_style() or no_style() in django.core.management.color.
|
||||||
"""
|
"""
|
||||||
return [] # No sequence reset required by default.
|
return [] # No sequence reset required by default.
|
||||||
|
|
||||||
def start_transaction_sql(self):
|
def start_transaction_sql(self):
|
||||||
"""
|
"""
|
||||||
|
@ -915,6 +916,7 @@ class BaseDatabaseOperations(object):
|
||||||
conn = ' %s ' % connector
|
conn = ' %s ' % connector
|
||||||
return conn.join(sub_expressions)
|
return conn.join(sub_expressions)
|
||||||
|
|
||||||
|
|
||||||
class BaseDatabaseIntrospection(object):
|
class BaseDatabaseIntrospection(object):
|
||||||
"""
|
"""
|
||||||
This class encapsulates all backend-specific introspection utilities
|
This class encapsulates all backend-specific introspection utilities
|
||||||
|
@ -1010,12 +1012,14 @@ class BaseDatabaseIntrospection(object):
|
||||||
for model in models.get_models(app):
|
for model in models.get_models(app):
|
||||||
if not model._meta.managed:
|
if not model._meta.managed:
|
||||||
continue
|
continue
|
||||||
|
if model._meta.swapped:
|
||||||
|
continue
|
||||||
if not router.allow_syncdb(self.connection.alias, model):
|
if not router.allow_syncdb(self.connection.alias, model):
|
||||||
continue
|
continue
|
||||||
for f in model._meta.local_fields:
|
for f in model._meta.local_fields:
|
||||||
if isinstance(f, models.AutoField):
|
if isinstance(f, models.AutoField):
|
||||||
sequence_list.append({'table': model._meta.db_table, 'column': f.column})
|
sequence_list.append({'table': model._meta.db_table, 'column': f.column})
|
||||||
break # Only one AutoField is allowed per model, so don't bother continuing.
|
break # Only one AutoField is allowed per model, so don't bother continuing.
|
||||||
|
|
||||||
for f in model._meta.local_many_to_many:
|
for f in model._meta.local_many_to_many:
|
||||||
# If this is an m2m using an intermediate table,
|
# If this is an m2m using an intermediate table,
|
||||||
|
@ -1052,6 +1056,7 @@ class BaseDatabaseIntrospection(object):
|
||||||
"""
|
"""
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
|
||||||
class BaseDatabaseClient(object):
|
class BaseDatabaseClient(object):
|
||||||
"""
|
"""
|
||||||
This class encapsulates all backend-specific methods for opening a
|
This class encapsulates all backend-specific methods for opening a
|
||||||
|
@ -1068,6 +1073,7 @@ class BaseDatabaseClient(object):
|
||||||
def runshell(self):
|
def runshell(self):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
|
||||||
class BaseDatabaseValidation(object):
|
class BaseDatabaseValidation(object):
|
||||||
"""
|
"""
|
||||||
This class encapsualtes all backend-specific model validation.
|
This class encapsualtes all backend-specific model validation.
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
from __future__ import absolute_import, unicode_literals
|
from __future__ import absolute_import, unicode_literals
|
||||||
|
import copy
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
|
@ -6,6 +7,7 @@ from django.core import management
|
||||||
from django.core.exceptions import FieldError
|
from django.core.exceptions import FieldError
|
||||||
from django.db import models, DEFAULT_DB_ALIAS
|
from django.db import models, DEFAULT_DB_ALIAS
|
||||||
from django.db.models import signals
|
from django.db.models import signals
|
||||||
|
from django.db.models.loading import cache
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
|
||||||
|
|
||||||
|
@ -147,6 +149,12 @@ class ProxyModelTests(TestCase):
|
||||||
|
|
||||||
def test_swappable(self):
|
def test_swappable(self):
|
||||||
try:
|
try:
|
||||||
|
# This test adds dummy applications to the app cache. These
|
||||||
|
# need to be removed in order to prevent bad interactions
|
||||||
|
# with the flush operation in other tests.
|
||||||
|
old_app_models = copy.deepcopy(cache.app_models)
|
||||||
|
old_app_store = copy.deepcopy(cache.app_store)
|
||||||
|
|
||||||
settings.TEST_SWAPPABLE_MODEL = 'proxy_models.AlternateModel'
|
settings.TEST_SWAPPABLE_MODEL = 'proxy_models.AlternateModel'
|
||||||
|
|
||||||
class SwappableModel(models.Model):
|
class SwappableModel(models.Model):
|
||||||
|
@ -165,6 +173,8 @@ class ProxyModelTests(TestCase):
|
||||||
proxy = True
|
proxy = True
|
||||||
finally:
|
finally:
|
||||||
del settings.TEST_SWAPPABLE_MODEL
|
del settings.TEST_SWAPPABLE_MODEL
|
||||||
|
cache.app_models = old_app_models
|
||||||
|
cache.app_store = old_app_store
|
||||||
|
|
||||||
def test_myperson_manager(self):
|
def test_myperson_manager(self):
|
||||||
Person.objects.create(name="fred")
|
Person.objects.create(name="fred")
|
||||||
|
|
Loading…
Reference in New Issue