我正在对模型进行更改
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
我不知道如何继续,感谢任何帮助。
您在元选项中设置了
app_label = 'easytrade20'
,但 Django 无法检测到您项目中名为 easytrade20
的应用程序。这就是为什么没有任何改变。
因此,将
easytrade20
添加到您的 INSTALLED_APPS
或从模型的元数据中删除 app_label = 'easytrade20'
,然后再次尝试运行迁移。
试试这个:
python manage.py makemigrations [app_name]
python manage.py migrate
该应用程序可能未在 settings.py 中的
INSTALLED_APPS
中列出,因此 Django 尚未注册您的应用程序,并且不会检测需要在该应用程序中运行的迁移。
将
easytrade20
添加到您的 INSTALLED_APPS
并再次尝试运行迁移。
如果上述答案对您不起作用,我建议您基于现有数据库制作模型和迁移。下面概述了完成此任务的步骤。
下面我建议您的应用程序目录也称为
。easytrade20
我认为您已经拥有一个正在使用的数据库,并且所有迁移都已应用于该数据库。如果没有,并保存 迁移的结构对您来说并不重要,然后跳过步骤 2-3。
如果您的任何其他应用程序的迁移依赖于
迁移,您需要为每个应用程序重复步骤 2-5(通过将easytrade20
重命名为您的应用程序名称),然后再开始步骤 6(并且需要 6 个以上的步骤)也适用于该应用程序)。easytrade20
pip install django==3.0.* -U
适用于 3.0.X(3.0.10
是我写这些行时的最新版本)
或
pip install django==3.1.*
最新版本(3.1 与 3.0 没有太大区别,也许它是您的正确选择)
使用 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
)。
使用inspectdb生成模型:
python manage.py inspectdb > generated_models.py
将创建文件
generated_models.py
。您需要从此文件复制为 easytrade20
应用程序创建的所有模型。将您的 models.py
替换为生成的模型,并至少在模型 managed = False
中删除 AppContactCnt
。
easytrade20
迁移的信息python manage.py migrate --fake easytrade20 zero
现在,如果您运行
python manage.py showmigrations easytrade20
,您将看到所有迁移均未应用。
就是这样。完全删除目录
easytrade20/migrations
。
然后,如果您运行
python manage.py showmigrations easytrade20
,您将看到文本 (no migrations)
运行makemigrations命令:
python manage.py makemigrations easytrade20
将创建文件夹
easytrade20/migrations
。如果没有,那么您需要检查两件事:
settings.py
,以确保 easytrade20
包含在您的 INSTALLED_APPS
中。easytrade20
应用程序设置。确保您的文件具有相似的代码:# easytrade20/__init__.py
default_app_config = 'easytrade20.apps.EasyTradeConfig'
# easytrade20/apps.py
from django.apps import AppConfig
class EasyTradeConfig(AppConfig):
name = 'easytrade20'
如果您有包含此表的数据库,则进行假迁移:
python manage.py migrate easytrade20 --fake-initial
如果没有,则无需运行
--fake-initial
:
python manage.py migrate easytrade20
更改您的
models.py
文件。
运行
python manage.py makemigrations easytrade20
。将在您的 easytrade20/migrations
目录中创建新文件。
运行
python manage.py migrate easytrade20
以应用新迁移。
确保您的应用程序已在
settings.py
和 INSTALLED_APP
部分中注册。
如果有人被这个问题困扰,我将我的模型分成不同的类在一个包中
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()