gpt4 book ai didi

python - Django 数据迁移与 models.py 不匹配

转载 作者:行者123 更新时间:2023-11-30 22:59:11 25 4
gpt4 key购买 nike

我们在项目中使用 django 1.8 和迁移,并且反复遇到以下问题:

  1. 我们通过迁移 1 更改/添加模型
  2. 我们添加/更改一些数据以满足迁移 2 的新逻辑
  3. 我们再次更改模型并创建迁移 3

现在,其中一位开发人员同步了 3 个新迁移,并由于 models.py 和数据库之间不匹配而遇到错误。

到目前为止,我们要么伪造了出错的迁移,要么临时更改了依赖项。但这既不系统也不方便。

有没有更好的方法来解决这个问题?

下面是一个简单的例子来说明问题是如何产生的:原始模型.py

class Test(models.Model):
a = models.CharField(max_length=200, verbose_name="A")
b = models.CharField(max_length=200, verbose_name="B")

模型更改之前的迁移:

0001_initial.py

class Migration(migrations.Migration):

dependencies = [
]

operations = [
migrations.CreateModel(
name='Test',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('a', models.CharField(max_length=200, verbose_name=b'A')),
('b', models.CharField(max_length=200, verbose_name=b'B')),
],
),
]

0002_auto_20160308_1103.py

def testData(apps, schema_editor):
Test.objects.create(a="aaaa", b="bbb")
class Migration(migrations.Migration):

dependencies = [
('Test', '0001_initial'),
]

operations = [
migrations.RunPython(testData)
]

新模型.py

class Test(models.Model):
a = models.CharField(max_length=200, verbose_name="A")
b = models.CharField(max_length=200, verbose_name="B")
c = models.CharField(max_length=200, verbose_name="C", default="c")

上次迁移:

0003_test_c.py

class Migration(migrations.Migration):

dependencies = [
('Test', '0002_auto_20160308_1103'),
]

operations = [
migrations.AddField(
model_name='test',
name='c',
field=models.CharField(default=b'c', max_length=200, verbose_name=b'C'),
),
]

运行migrate会导致django.db.utils.OperationalError:运行第二次迁移时,表Test_test没有名为c的列

最佳答案

您没有使用迁移系统提供的功能。特别是,您直接引用测试模型;但是迁移系统包含“历史模型”的概念,该概念是从迁移到该点动态建立的,因此可以准确地解决这个问题。

documentation进一步解释了这一点,但基本上您应该动态获取它,而不是在迁移 0002 中导入 Test:

def testData(apps, schema_editor):
Test = apps.get_model("myapp", "Test")
Test.objects.create(a="aaaa", b="bbb")

关于python - Django 数据迁移与 models.py 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35864307/

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