我正在使用MSSQL数据库,我在Django进入节目之前已经创建了一些表,所以使用 inspectdb 我得到了具有managed=False
Meta选项的模型。然后我创建了与Django迁移一起工作的其他人。这个模型是这样的:
class ModelAlreadyCreated(models.Model):
# This PK field is set as varchar(16)
id = models.CharField(primary_key=True, db_column='CVE', max_length=16)
...other fields
class Meta:
managed=False
class DjangoModel(models.Model):
model_ac_fk = models.ForeignKey(ModelAlreadyCreated)
... other fields
当我使用makemigrations
创建迁移文件时,我得到了这个:
migrations.CreateModel(
name='DjangoModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('model_ac_fk', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ModelAlreadyCreated')),
...
],
),
在此之前,一切似乎都没问题,但是使用migrate
命令会显示此错误:
django.db.utils.OperationalError: (1778, "Column 'CVE' is not the same data
type as referencing column 'model_ac_fk' in foreign key 'model_ac_fk_fk_CVE'.DB-Lib error
message 20018, severity 16:\nGeneral SQL Server error: Check messages from
the SQL Server\nDB-Lib error message 20018, severity 16:\nGeneral SQL Server
error: Check messages from the SQL Server\n")
出现此错误是因为Django正在尝试创建nvarchar(16)
foreignkey字段,而实际引用的字段为varchar(16)
我可以使用sqlmigrate
获取SQL并更改字段类型,然后直接在数据库中运行它并伪造迁移,但我想知道是否有任何方法可以使用Django进行迁移而不需要触摸任何SQL脚本?