makemigrations 响应 指定 app_label 时未检测到更改

Posted

技术标签:

【中文标题】makemigrations 响应 指定 app_label 时未检测到更改【英文标题】:makemigrations reponses No changes detected when app_label is specified 【发布时间】:2019-02-16 15:17:20 【问题描述】:

我有 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'

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

谢谢:)

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

我发现了我的错误。太感谢了!但是,我将models.py中的app_label和routers.py中的条件更改为“myapp”,它仍然不起作用。我得到 Applying myapp.0001_initial...OK,但没有在 DB 上创建表

以上是关于makemigrations 响应 指定 app_label 时未检测到更改的主要内容,如果未能解决你的问题,请参考以下文章

98.ORM迁移详解,makemigrations,migrate

makemigrations 无法在 INSTALLED_APPS 中找到应用程序

Django 执行 makemigrations 显示 No changes detected in app

Django makemigrations 未检测到项目/应用程序/myapp

子应用程序中“自我”的 ForeignKey 在 Django 项目中的 makemigrations 中引发错误

django.db.utils.ProgrammingError尝试从github克隆的app上的manage.py makemigrations