Django一直在迁移相同的外键

Django一直在迁移相同的外键,django,inspectdb,Django,Inspectdb,我正在将一个现有数据库导入到它自己的Django项目中。我已经通过inspectdb从数据库生成了初始模型,并通过注释表元设置中的managed=False行,使Django能够一次一个地控制每个表。我从简单的模型开始,在启用带有外键的表时遇到了一个障碍。Django一直在为外键DocTagID生成相同的迁移,我不知道为什么会这样做 有问题的表如下所示,所有内容都是由inspectdb生成的,但注释行除外,我将表的控制权交给了Django class Doctagversion(models.M

我正在将一个现有数据库导入到它自己的Django项目中。我已经通过
inspectdb
从数据库生成了初始模型,并通过注释表元设置中的
managed=False
行,使Django能够一次一个地控制每个表。我从简单的模型开始,在启用带有外键的表时遇到了一个障碍。Django一直在为外键
DocTagID
生成相同的迁移,我不知道为什么会这样做

有问题的表如下所示,所有内容都是由
inspectdb
生成的,但注释行除外,我将表的控制权交给了Django

class Doctagversion(models.Model):
    id = models.IntegerField(db_column='Id', primary_key=True, blank=True)  # Field name made lowercase.
    doctagid = models.ForeignKey(DocTag, models.DO_NOTHING, db_column='DocTagId')  # Field name made lowercase.
    groupname = models.TextField(db_column='GroupName')  # Field name made lowercase.
    name = models.TextField(db_column='Name')  # Field name made lowercase.
    creationdate = models.DateTimeField(db_column='CreationDate')  # Field name made lowercase.
    lasteditdate = models.DateTimeField(db_column='LastEditDate', blank=True, null=True)  # Field name made lowercase.
    lastedituserid = models.IntegerField(db_column='LastEditUserId')  # Field name made lowercase.
    lastedituserdisplayname = models.TextField(db_column='LastEditUserDisplayName')  # Field name made lowercase.
    releasedate = models.DateTimeField(db_column='ReleaseDate', blank=True, null=True)  # Field name made lowercase.

    class Meta:
#         managed = False
        db_table = 'DocTagVersion'
在传递此控件之前,将使用
python-m manage.py makemigrations
生成相关架构的初始迁移,并与
python-m manage.py migrate
一起应用。表的初始迁移如下所示,
managed
最初设置为
False
,我认为应该添加注释行来通知Django外键(
inspectdb
在生成的
models.py
中的状态相同)

当我启用对表的控制时,第一次迁移只是更改表选项

    migrations.AlterModelOptions(
        name='doctagversion',
        options={},
    ),
Django在初始迁移中不存在有问题的外键时添加该外键,如下所示

    migrations.AddField(
        model_name='doctagversion',
        name='doctagid',
        field=models.ForeignKey(db_column='DocTagId', default=-1, on_delete=django.db.models.deletion.DO_NOTHING, to='docutoo.DocTag'),
        preserve_default=False,
    ),
此后,它在
python m manage.py makemigrations
python-m manage.py migrate
之间以一个周期重复生成以下迁移

    migrations.AlterField(
        model_name='doctagversion',
        name='doctagid',
        field=models.ForeignKey(db_column='DocTagId', on_delete=django.db.models.deletion.DO_NOTHING, to='docutoo.DocTag'),
    ),
也许我的策略是错误的,我应该在一次迁移中启用所有表

就我所知,以下相关问题不能解释我的情况:

从这一点来看,Django迁移似乎对命名非常敏感,我已经注释掉了所有模型中的
db_表。我相信我是在创建了最初的迁移之后,无意中打破了后来的迁移

  class Meta : 
    ...
#     db_table = "TableName"
因为我破坏了命名
makemigrations
,所以无法看到表名已更改,并且正在尽最大努力通过重复声明字段来解决它

在一边 巧合的是,当一个人像我的问题中所描述的那样为现有数据库创建初始迁移时(
inspectdb
->
makemigrations
->
migrate
),Django按字母顺序遍历模型,以相同的顺序创建表,并忽略外键。它按字母顺序创建表,然后修改它们以包含外键,删除现有数据库中可能存在的任何数据。似乎一开始必须将外键定义为整数字段,并在Django管理表时将其更改回原处。或者,可以注释掉所有模型,并在以解析外键的方式取消注释它们时生成迁移;Django随后将相应地链接它们。然后可以将迁移压缩为单个迁移,并将其设置为初始迁移

  class Meta : 
    ...
#     db_table = "TableName"