makemigrations reponses指定app_label时未检测到任何更改

问题描述 投票:3回答:1

我有2个mysql数据库,我想为第二个创建一个新模型(analysis_db),但在运行makemigrations后,它会显示“未检测到任何更改”。这是我的代码

在settings.py中(我将myapp添加到INSTALLED_APPS)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': DB_DEFAULT_NAME,
        'USER': DB_USER,
        'PASSWORD': DB_PASSWORD,
        'HOST': DB_HOST,
        'PORT': '',
        'OPTIONS': {
            'sql_mode': 'traditional',
        }
    },
    'analysis_db': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': DB_ANALYSIS_NAME,
        'USER': DB_USER,
        'PASSWORD': DB_PASSWORD,
        'HOST': DB_HOST,
        'PORT': '',
        'OPTIONS': {
            'sql_mode': 'traditional',
        }
    }
}
DATABASE_ROUTERS = ['my_project.routers.TestRouter']

在routers.py中

class TestRouter:
    """
    A router to control all database operations on models in the
    auth application.
    """
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'analysis_data':
            return 'analysis_db'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'analysis_data':
            return 'analysis_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label == 'analysis_data' or \
           obj2._meta.app_label == 'analysis_data':
           return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'analysis_data':
            return db == 'analysis_db'
        return None

在models.py中

class TestModel(models.Model):
    id = models.AutoField(primary_key=True)
    val1 = models.IntegerField()
    val2 = models.IntegerField()

    class Meta:
        app_label = 'analysis_data'
        db_table = 'test_table_on_db'

但是,如果我从app_label = 'analysis_data'中删除models.py,并再次运行makemigrations,它可以工作,但该表是在默认数据库上创建的。有没有人遇到同样的问题?

谢谢 :)

python django database model
1个回答
1
投票

我认为您的模型上的“app_label”需要设置为安装在INSTALLED_APPS设置中的应用程序的名称。你提到你在INSTALLED_APPS中添加了“myapp”,但是“analysis_data”呢?

如果您使用的是应用名称“analysis_data”,并且没有具有该名称的应用,那么它将不会为该应用进行迁移,因为它不存在。

因此,为了解决这个问题,您应该将“analysis_data”的模型移动到另一个Django应用程序(您可以在同一个项目中拥有多个应用程序),并将其显式添加到您的INSTALLED_APPS中。然后,当你运行python manage.py makemigrations analysis_data它应该工作。

© www.soinside.com 2019 - 2024. All rights reserved.