Python Django使用migrations命令继续为旧数据库重新创建外键字段

Python Django使用migrations命令继续为旧数据库重新创建外键字段,python,mysql,django,django-models,legacy-database,Python,Mysql,Django,Django Models,Legacy Database,我对Django开发公司很陌生。我正在使用MySQL创建的遗留数据库。现在我面临着Django迁移的问题。我有几个表使用外键引用另一个表。现在,如果我允许Django使用外键管理这些表,那么Django会在makemigrations和migrate命令期间尝试重新创建外键字段。即使这些领域已经存在。此外,如果我不允许Django管理这些表,那么这个Django可以很好地处理数据库 我的代码用于面向表的错误 Models.py 迁移代码 尝试迁移时的回溯 现在我知道Django正在尝试重新创建外

我对Django开发公司很陌生。我正在使用MySQL创建的遗留数据库。现在我面临着Django迁移的问题。我有几个表使用外键引用另一个表。现在,如果我允许Django使用外键管理这些表,那么Django会在makemigrations和migrate命令期间尝试重新创建外键字段。即使这些领域已经存在。此外,如果我不允许Django管理这些表,那么这个Django可以很好地处理数据库

我的代码用于面向表的错误

Models.py 迁移代码 尝试迁移时的回溯 现在我知道Django正在尝试重新创建外键字段。但由于它是一个遗留数据库,我无法理解为什么会发生这种情况。

根据文档,您需要告诉django不要管理您的模型。设置
managed=False
,如果您不希望django在迁移过程中创建或修改任何内容的话。

我今天遇到了这个问题,当时我不得不使用django 1.11对一个真正的遗留项目进行一个小的更改。我相信你遇到了麻烦。中提到的解决方法对我有效。这个bug还没有解决,所以它可能仍然会出现在Django的新版本中

基本上,您将执行以下步骤来解决问题:

  • 最初运行
    inspectdb
    并创建模型时,Django将使用
    managed=False
    创建模型
  • models.py
    中,您应该在进行迁移之前临时设置
    managed=True
  • 然后使用
    manage.py makemigrations
    创建迁移。现在还不运行迁移
  • 检查生成的迁移文件并手动将所有
    managed:True
    更新为
    manage:False
  • 最后返回您的
    models.py
    并将任何
    managed=True
    恢复为
    managed=False
  • 现在使用
    manage.py migrate
    运行迁移
  • 完成上述步骤后,应执行以下操作将非托管模型转换为托管模型:

  • models.py
    中,您现在将永久设置
    managed=True
    ,或者只需删除
    managed
    行,因为它默认为
    True
  • 使用
    manage.py makemigrations
    创建迁移
  • 使用
    manage.py migrate
    运行迁移

  • 此时,您可以自由地对模型进行进一步更新,并且您会注意到Django不再尝试重新创建已经存在的
    ForeignKey

    我检查过了。但是我想为我的工作修改表,所以我只是尝试从模型中删除外键的字段,而没有从数据库中删除原始字段。我可以继续吗?谢谢你的回复。
    from django.db import models
    from django.utils.translation import gettext_lazy as _
    from django.db.models.signals import pre_save
    from chooseright.utils import unique_slug_generator
    
    class StoreTable(models.Model):
        store_id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=45, blank=True, null=True)
        slug = models.SlugField(max_length=45, blank=True, null=True)
        category = models.ForeignKey(CategoryTable, on_delete=models.CASCADE, blank=True, null=True)
        brand = models.ForeignKey(BrandTable, models.DO_NOTHING, blank=True, null=True)
        
        class Meta:
            managed = True
            db_table = 'store_table'
            verbose_name = _("Store")
            verbose_name_plural = _("Stores")
    
        def __str__(self):
            return self.name
    
    from django.db import migrations, models
    import django.db.models.deletion
    
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ('core', '0009_auto_20200820_1258'),
        ]
    
        operations = [
            migrations.RenameField(
                model_name='storetable',
                old_name='store_name',
                new_name='name',
            ),
            migrations.AddField(
                model_name='storetable',
                name='brand',
                field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='core.BrandTable'),
            ),
            migrations.AddField(
                model_name='storetable',
                name='category',
                field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.CategoryTable'),
            ),
        ]
    
      File "C:\Users\Usama\dev\Django Projects\lib\site-packages\MySQLdb\connections.py", line 259, in query
        _mysql.connection.query(self, query)
    django.db.utils.OperationalError: (1060, "Duplicate column name 'brand_id'")