Django 3.0.7 - 对模型进行更改后未检测到任何更改

问题描述 投票:0回答:6

我正在对模型进行更改

AppContactCnt
以添加新字段来处理记录删除。 这是 models.py

class AppContactCnt(models.Model):
    id_cnt = models.AutoField(primary_key=True)
    # idcst_cnt = models.IntegerField()
    idcst_cnt = models.ForeignKey(AppCustomerCst, models.DO_NOTHING, db_column='idcst_cnt')
    idctp_cnt = models.ForeignKey(AppContactTypeCtp, models.DO_NOTHING, db_column='idctp_cnt')
    idtrp_cnt = models.IntegerField()
    name_cnt = models.CharField(max_length=50)
    phone_cnt = models.CharField(max_length=50, blank=True, null=True)
    email_cnt = models.CharField(max_length=100, blank=True, null=True)
    note_cnt = models.CharField(max_length=100, blank=True, null=True)
    receives_emails_cnt = models.BooleanField(blank=True, null=True)
    deleted_cnt = models.BooleanField(blank=True, null=True)
    # date_deleted_cnt = models.DateTimeField(blank=True, null=True)
    # deleted_by_cnt = models.CharField(max_length=100, blank=True, null=True)

    class Meta:
        db_table = 'app_contact_cnt'
        app_label = 'easytrade20'

我尝试添加

managed = True
没有改变。

还尝试了以下方法: 删除除 init 之外的所有先前的迁移文件和 pycache 文件。

python manage.py migrate --fake-initial
python manage.py makemigrations
python manage.py migrate

我还在

No changes detected

我不知道如何继续,感谢任何帮助。

django django-migrations
6个回答
4
投票

您在元选项中设置了

app_label = 'easytrade20'
,但 Django 无法检测到您项目中名为
easytrade20
的应用程序。这就是为什么没有任何改变。

因此,将

easytrade20
添加到您的
INSTALLED_APPS
或从模型的元数据中删除
app_label = 'easytrade20'
,然后再次尝试运行迁移。


4
投票

试试这个:

python manage.py makemigrations [app_name]
python manage.py migrate

0
投票

问题

该应用程序可能未在 settings.py 中的

INSTALLED_APPS
中列出,因此 Django 尚未注册您的应用程序,并且不会检测需要在该应用程序中运行的迁移。

解决方案

easytrade20
添加到您的
INSTALLED_APPS
并再次尝试运行迁移。


0
投票

如果上述答案对您不起作用,我建议您基于现有数据库制作模型和迁移。下面概述了完成此任务的步骤。

下面我建议您的应用程序目录也称为

easytrade20

我认为您已经拥有一个正在使用的数据库,并且所有迁移都已应用于该数据库。如果没有,并保存 迁移的结构对您来说并不重要,然后跳过步骤 2-3。

如果您的任何其他应用程序的迁移依赖于

easytrade20
迁移,您需要为每个应用程序重复步骤 2-5(通过将
easytrade20
重命名为您的应用程序名称),然后再开始步骤 6(并且需要 6 个以上的步骤)也适用于该应用程序)。


0。更改之前备份您的文件和数据库

1.将您的 Django 版本更新到最新版本

pip install django==3.0.* -U
适用于 3.0.X(
3.0.10
是我写这些行时的最新版本)

pip install django==3.1.*
最新版本(3.1 与 3.0 没有太大区别,也许它是您的正确选择)

2.检查是否应用了所有迁移

使用 showmigrations 命令显示已应用的迁移:

python manage.py showmigrations

您将看到所有应用程序及其迁移的结构,如下所示(例如

app1
app2
):

app1
 [X] 0001_initial
app2
 [X] 0001_initial
 [X] 0002_some_other_migration

您将看到您的应用程序和一些 django 应用程序/第三方软件包,例如

admin
auth
database
sessions
等。

如果您在每次迁移附近都能看到所有

[X]
- 一切都很好,请继续。

如果您会看到一些

[ ] migration_name
- 请先尝试应用这些迁移。对每个应用程序的每个未应用(未经检查)的迁移运行
python manage.py migrate app_name migration_name
(例如
app_name
)。

3.根据您的数据库结构创建新模型

使用inspectdb生成模型:

python manage.py inspectdb > generated_models.py

将创建

文件

generated_models.py
。您需要从此文件复制为
easytrade20
应用程序创建的所有模型。将您的
models.py
替换为生成的模型,并至少在模型
managed = False
中删除
AppContactCnt

4.从数据库中删除有关
easytrade20
迁移的信息

python manage.py migrate --fake easytrade20 zero

现在,如果您运行

python manage.py showmigrations easytrade20
,您将看到所有迁移均未应用。

5.删除您的迁移目录

就是这样。完全删除目录

easytrade20/migrations

然后,如果您运行

python manage.py showmigrations easytrade20
,您将看到文本
(no migrations)

6.生成新的迁移

运行makemigrations命令:

python manage.py makemigrations easytrade20

将创建

文件夹

easytrade20/migrations
。如果没有,那么您需要检查两件事:

  1. 您的
    settings.py
    ,以确保
    easytrade20
    包含在您的
    INSTALLED_APPS
    中。
  2. 您的
    easytrade20
    应用程序设置。确保您的文件具有相似的代码:
# easytrade20/__init__.py
default_app_config = 'easytrade20.apps.EasyTradeConfig'
# easytrade20/apps.py
from django.apps import AppConfig


class EasyTradeConfig(AppConfig):
    name = 'easytrade20'

7.应用初始迁移

如果您有包含此表的数据库,则进行假迁移:

python manage.py migrate easytrade20 --fake-initial

如果没有,则无需运行

--fake-initial
:

python manage.py migrate easytrade20

8.更改您的模型,创建并应用迁移

更改您的

models.py
文件。

运行

python manage.py makemigrations easytrade20
。将在您的
easytrade20/migrations
目录中创建新文件。

运行

python manage.py migrate easytrade20
以应用新迁移。


0
投票

确保您的应用程序已在

settings.py
INSTALLED_APP
部分中注册。


0
投票

如果有人被这个问题困扰,我将我的模型分成不同的类在一个包中

models
。 在
__init__.py
models
中,我必须导入类,即

__init.py__

from app.model.Foo import *
from app.model.Bar import *

app.model.Foo.py

from django.db import models
from app.models.Bar import Bar

class Foo:
    class Meta:
        app_label = 'app'

    name = models.CharField(max_length=255)
    bars = models.ManyToManyField(Bar)

app.model.Bar.py

from django.db import models
from app.models.Bar import Bar

class Bar:
    class Meta:
        app_label = 'app'

    text = models.TextField()
© www.soinside.com 2019 - 2024. All rights reserved.