Django迁移失败

时间:2017-09-08 15:28:23

标签: python django postgresql

我有一个django / postgresql应用程序。每当我运行最新的迁移时,都会收到以下错误:

  

ValueError:发现包(特殊,标题)约束的编号(0)错误

我认为我需要自定义迁移,但我应该做出哪些改变。

这是迁移:

  

操作= [

    migrations.AddField(

        model_name='package',

        name='speciality',

        field=models.ManyToManyField(related_name='specialities', to='speciality.Speciality', blank=True),

    ),

    migrations.AlterField(

        model_name='package',

        name='title',

        field=models.CharField(unique=True, max_length=50),

    ),

    migrations.AlterUniqueTogether(

        name='package',

        unique_together=set([]),

    ),

    migrations.RemoveField(

        model_name='package',

        name='speciality',

    ),

]

这是我此模型的当前表格配置:

  

sleepyfish =#\ d \ package                                        表" public.package"       专栏|输入|修饰符
  --------------- + --------- + ------- ----------------------------------------------- id |整数|不是默认值   nextval(' package_id_seq' :: regclass)created_at |时间戳   时区| not null updated_at |时区的时间戳|不   null title |字符变化(50)|不是空的描述   |文字|状态|布尔
  |不是零价格数字(8,2)|不是空的   speciality_id |整数|索引:       " package_pkey" PRIMARY KEY,btree(id)       " package_speciality_id_3aeb5c97679442e4_uniq" UNIQUE CONSTRAINT,btree(speciality_id,title)       " package_66db61fe" btree(speciality_id)外键约束:       " package_speciality_id_4255b58fe1ae00c0_fk_speciality_id" FOREIGN KEY(speciality_id)参考专业(id)最初可以推荐   DEFERRED参考:       表" claimpackage" CONSTRAINT" claimspackage_package_id_9e1da358fbb9a46_fk_package_id"外键   (package_id)REFERENCES包(id)可伸缩的最小值       表" package_service" CONSTRAINT" package_service_package_id_3b0ea08bfcd8da76_fk_package_id"国外   KEY(package_id)REFERENCES包(id)可伸缩的初始值

3 个答案:

答案 0 :(得分:7)

看起来你遇到了this记录的Django bug。错误是triaged as invalid(这是正确的),所以很遗憾没有解决问题的干净方法。

数据库定义中的唯一一起约束显示为

"package_speciality_id_3aeb5c97679442e4_uniq" UNIQUE CONSTRAINT,
btree (speciality_id, title)

如果要删除此约束,则需要确保迁移文件中的unique_together定义与数据库定义一致。尝试用此替换AlterUniqueTogether行:

migrations.AlterUniqueTogether(
    name='package',
    unique_together=set([('speciality_id', 'title')]),
),

答案 1 :(得分:1)

万一有人遇到和我一样的问题:
我有一个多租户系统,其中每个租户都有自己的架构,public架构留空。

当Django尝试检查数据库的当前状态以删除与历史数据库匹配的真实唯一约束时,它只查看public模式内部,忽略OPTIONS中设置的模式信息。 DATABASES设置。

关于这个问题,有几张门票是公开的,没有真正的解决方案:#6148#22673

您可以随时编写自己的数据库后端来规避问题,或者向Django提交拉取请求!

答案 2 :(得分:1)

如果arjun27的答案不能解决您的问题,这是一种替代方法。

今天,当我尝试从Django模型中删除unique_together时遇到了同样的问题(带有问题的确切关键字)。我正在使用Django 1.11。

arjun27阅读文档和参考资料,据我所知,在上述情况下,迁移过程将尝试在Postgresql的字段(speciality, title)上找到UNIQUE CONTRAINST。

我尝试在桌子上找到UNIQUE CONSTRAINT,但找不到。

因此,我直接从SQL控制台创建UNIQUE CONSTRAINT。

ALTER TABLE package ADD UNIQUE (speciality, title)

然后我重新运行迁移。

希望有帮助。