Django migrate在第二个数据库中创建了错误的表

Django migrate在第二个数据库中创建了错误的表,django,database,django-models,Django,Database,Django Models,我想创建一个仅由Django项目中的第二个数据库使用的模型。所以理论上,我会有一个默认数据库,其中包含所有应用程序及其模型,然后这个新数据库将有一个单独的应用程序模型,这将是我的工作数据 我遇到的问题是,每当我迁移到新数据库时,它都会复制所有表,包括只打算在新数据库中的新表。所有原始内容类型、会话、身份验证等都将添加到此新的“作业”数据库中。我只希望Jobdata模型/表位于jobs数据库中 我已经检查了好几次了,但是我设置的路由器并没有太大的成功 我也尝试过一些选项,但它们有点过时,没有详细说

我想创建一个仅由Django项目中的第二个数据库使用的模型。所以理论上,我会有一个默认数据库,其中包含所有应用程序及其模型,然后这个新数据库将有一个单独的应用程序模型,这将是我的工作数据

我遇到的问题是,每当我迁移到新数据库时,它都会复制所有表,包括只打算在新数据库中的新表。所有原始内容类型、会话、身份验证等都将添加到此新的“作业”数据库中。我只希望Jobdata模型/表位于jobs数据库中

我已经检查了好几次了,但是我设置的路由器并没有太大的成功

我也尝试过一些选项,但它们有点过时,没有详细说明迁移问题

以下是我当前的设置:

#models.py
#the new table/model that I want to go to a new separate database called jobs
class Jobdata(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
employer_name = models.CharField(max_length=50, blank=True)
empoyer_profile_id = models.CharField(max_length=50, blank=True)

#also in models.py
#the router class used to pick the right database
class JobDataRouter:
    '''Used to tell Django which database must use the job data model'''
    def db_for_read(self, model, **hints):
        """
        Attempts to read Jobdata models go to jobs database.
        """
        if model._meta.app_label == 'jobdata':
            return 'jobs'
        return None

    def db_for_write(self, model, **hints):
        """
        Attempts to write Jobdata models go to jobs database.
        """
        if model._meta.app_label == 'jobdata':
            return 'jobs'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """
        Allow relations if a model in the jobdata app is involved.
        """
        if obj1._meta.app_label == 'jobdata' or \
           obj2._meta.app_label == 'jobdata':
           return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        Make sure the jobdata app only appears in the 'jobs'
        database.
        """
        if app_label == 'jobdata':
            return db == 'jobs'
        return None



#settings.py
DATABASE_ROUTERS = ['jobdata.models.JobDataRouter',]

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'django_live',
        'USER': 'postgres',
        'PASSWORD': os.environ.get('postgresuser'),
        'HOST': '127.0.0.1',
        'PORT': '5433',
    },



    'jobs': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'jobs',
        'USER': 'postgres',
        'PASSWORD': os.environ.get('postgresuser'),
        'HOST': '127.0.0.1',
        'PORT': '5433',
    },
}

我设法让迁移将正确的模型应用到正确的数据库。如果其他人有这个问题,这就是我的工作:

我更改了我的数据库以使用空白默认值,然后我重命名了我的主数据库,在那里我想让常用的应用程序运行,例如用户、身份验证等。我称之为“主数据库”

#settings.py
DATABASE_ROUTERS = ['jobdata.models.JobRouter',]
DATABASES = {
    'default': {},
    'main': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'django_live',
        'USER': 'postgres',
        'PASSWORD': os.environ.get('postgresuser'),
        'HOST': '127.0.0.1',
        'PORT': '5433',
    },



    'jobs': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'jobs',
        'USER': 'postgres',
        'PASSWORD': os.environ.get('postgresuser'),
        'HOST': '127.0.0.1',
        'PORT': '5433',
    },
}
'''
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
然后我改变了我的路由器,让它根据它所指的应用选择主数据库或作业数据库。Django文档展示了如何对auth或contenttype应用程序执行此操作,但我只想对包含我的作业数据模型的jobdata应用程序执行此操作。所以我改变了逻辑

#model.py I should probably put this file somewhere else, but documentation doesn't #specify
class JobRouter:
"""
A router to control all database operations on models in the
auth and contenttypes applications.
"""
route_app_labels = {'jobdata'}

def db_for_read(self, model, **hints):
    """
    Attempts to read jobdata models go to jobs database.
    """
    if model._meta.app_label not in self.route_app_labels:
        return 'main'
    return 'jobs'

def db_for_write(self, model, **hints):
    """
    Attempts to write jobdata models go to jobs database.
    """
    if model._meta.app_label not in self.route_app_labels:
        return 'main'
    return 'jobs'

def allow_relation(self, obj1, obj2, **hints):
    """
    Allow relations if a model in the jobdata apps is
    involved.
    """
    if (
        obj1._meta.app_label not in self.route_app_labels or
        obj2._meta.app_label not in self.route_app_labels
    ):
       return None
    return True

def allow_migrate(self, db, app_label, model_name=None, **hints):
    """
    Make sure the jobdata apps only appear in the
    'jobs' database.
    """
    if app_label not in self.route_app_labels:
        return db == 'main'
    return 'jobs'

Django似乎不喜欢我先有一个默认表,然后是另一个新表。

我成功地进行了迁移,以便将正确的模型应用到正确的数据库。如果其他人有这个问题,这就是我的工作:

我更改了我的数据库以使用空白默认值,然后我重命名了我的主数据库,在那里我想让常用的应用程序运行,例如用户、身份验证等。我称之为“主数据库”

#settings.py
DATABASE_ROUTERS = ['jobdata.models.JobRouter',]
DATABASES = {
    'default': {},
    'main': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'django_live',
        'USER': 'postgres',
        'PASSWORD': os.environ.get('postgresuser'),
        'HOST': '127.0.0.1',
        'PORT': '5433',
    },



    'jobs': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'jobs',
        'USER': 'postgres',
        'PASSWORD': os.environ.get('postgresuser'),
        'HOST': '127.0.0.1',
        'PORT': '5433',
    },
}
'''
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
然后我改变了我的路由器,让它根据它所指的应用选择主数据库或作业数据库。Django文档展示了如何对auth或contenttype应用程序执行此操作,但我只想对包含我的作业数据模型的jobdata应用程序执行此操作。所以我改变了逻辑

#model.py I should probably put this file somewhere else, but documentation doesn't #specify
class JobRouter:
"""
A router to control all database operations on models in the
auth and contenttypes applications.
"""
route_app_labels = {'jobdata'}

def db_for_read(self, model, **hints):
    """
    Attempts to read jobdata models go to jobs database.
    """
    if model._meta.app_label not in self.route_app_labels:
        return 'main'
    return 'jobs'

def db_for_write(self, model, **hints):
    """
    Attempts to write jobdata models go to jobs database.
    """
    if model._meta.app_label not in self.route_app_labels:
        return 'main'
    return 'jobs'

def allow_relation(self, obj1, obj2, **hints):
    """
    Allow relations if a model in the jobdata apps is
    involved.
    """
    if (
        obj1._meta.app_label not in self.route_app_labels or
        obj2._meta.app_label not in self.route_app_labels
    ):
       return None
    return True

def allow_migrate(self, db, app_label, model_name=None, **hints):
    """
    Make sure the jobdata apps only appear in the
    'jobs' database.
    """
    if app_label not in self.route_app_labels:
        return db == 'main'
    return 'jobs'
Django似乎不喜欢我有一个默认表,然后是另一个新表