gpt4 book ai didi

Django 不断迁移同一个外键

转载 作者:行者123 更新时间:2023-12-04 15:53:34 26 4
gpt4 key购买 nike

我正在将现有数据库导入到它自己的 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.CreateModel(
name='Doctagversion',
fields=[
('id', models.IntegerField(blank=True, db_column='Id', primary_key=True, serialize=False)),
# ('doctagid',models.ForeignKey(db_column='DocTagId', default=-1, on_delete=models.deletion.DO_NOTHING, to='DocTag')),
('groupname', models.TextField(db_column='GroupName')),
('name', models.TextField(db_column='Name')),
('creationdate', models.DateTimeField(db_column='CreationDate')),
('lasteditdate', models.DateTimeField(blank=True, db_column='LastEditDate', null=True)),
('lastedituserid', models.IntegerField(db_column='LastEditUserId')),
('lastedituserdisplayname', models.TextField(db_column='LastEditUserDisplayName')),
('releasedate', models.DateTimeField(blank=True, db_column='ReleaseDate', null=True)),
],
options={
'db_table': 'DocTagVersion',
'managed': False,
},
),

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

    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 makemigrationspython -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'),
),

也许我的策略是错误的,我应该简单地在一次迁移中启用所有表?

据我所知,以下相关问题并未说明我的情况:

最佳答案

从这里Bug Report似乎 Django 迁移对命名非常敏感,我在所有模型中都注释掉了 db_table。我相信我是在创建初始迁移后无意中破坏了后来的迁移之后才这样做的。

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

因为我破坏了命名makemigrations看不到表名已经改变了,所以最好通过重复声明字段来解决它。

一边

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

关于Django 不断迁移同一个外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52856506/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com