Fixed #16353 -- don't try to create Site objects on all databases. Refs #15573, #15346. Thanks Aymeric Augustin for the report and the patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16868 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Carl Meyer 2011-09-21 22:46:48 +00:00
parent cfadc36be5
commit f91af72523
3 changed files with 9 additions and 18 deletions

View File

@ -56,14 +56,6 @@ class SpatiaLiteCreation(DatabaseCreation):
interactive=False, interactive=False,
database=self.connection.alias) database=self.connection.alias)
# One effect of calling syncdb followed by flush is that the id of the
# default site may or may not be 1, depending on how the sequence was
# reset. If the sites app is loaded, then we coerce it.
from django.db.models import get_model
Site = get_model('sites', 'Site')
if Site is not None and Site.objects.using(self.connection.alias).count() == 1:
Site.objects.using(self.connection.alias).update(id=settings.SITE_ID)
from django.core.cache import get_cache from django.core.cache import get_cache
from django.core.cache.backends.db import BaseDatabaseCache from django.core.cache.backends.db import BaseDatabaseCache
for cache_alias in settings.CACHES: for cache_alias in settings.CACHES:

View File

@ -3,14 +3,21 @@ Creates the default Site object.
""" """
from django.db.models import signals from django.db.models import signals
from django.db import router
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from django.contrib.sites import models as site_app from django.contrib.sites import models as site_app
def create_default_site(app, created_models, verbosity, db, **kwargs): def create_default_site(app, created_models, verbosity, db, **kwargs):
if Site in created_models: # Only create the default sites in databases where Django created the table
if Site in created_models and router.allow_syncdb(db, Site) :
if verbosity >= 2: if verbosity >= 2:
print "Creating example.com Site object" print "Creating example.com Site object"
s = Site(domain="example.com", name="example.com") # The default settings set SITE_ID = 1, and some tests in Django's test
# suite rely on this value. However, if database sequences are reused
# (e.g. in the test suite after flush/syncdb), it isn't guaranteed that
# the next id will be 1, so we coerce it. See #15573 and #16353. This
# can also crop up outside of tests - see #15346.
s = Site(pk=1, domain="example.com", name="example.com")
s.save(using=db) s.save(using=db)
Site.objects.clear_cache() Site.objects.clear_cache()

View File

@ -248,14 +248,6 @@ class BaseDatabaseCreation(object):
interactive=False, interactive=False,
database=self.connection.alias) database=self.connection.alias)
# One effect of calling syncdb followed by flush is that the id of the
# default site may or may not be 1, depending on how the sequence was
# reset. If the sites app is loaded, then we coerce it.
from django.db.models import get_model
Site = get_model('sites', 'Site')
if Site is not None and Site.objects.using(self.connection.alias).count() == 1:
Site.objects.using(self.connection.alias).update(id=settings.SITE_ID)
from django.core.cache import get_cache from django.core.cache import get_cache
from django.core.cache.backends.db import BaseDatabaseCache from django.core.cache.backends.db import BaseDatabaseCache
for cache_alias in settings.CACHES: for cache_alias in settings.CACHES: