首页 文章

Django迁移失败

提问于
浏览
8

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

ValueError:找到错误的数字(0)包(专业, Headers )

我相信我需要自定义迁移,但我应该做出哪些改变 .

这是迁移:

operations = [migrations.AddField(

MODEL_NAME = '包',

名称=“专业”,

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

migrations.AlterField(

MODEL_NAME = '包',

是name = ' Headers ',

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

migrations.AlterUniqueTogether(

命名=“包”,

unique_together =组([]),

migrations.RemoveField(

MODEL_NAME = '包',

名称=“专业”,

]

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

sleepyfish =#\ d package表“public.package”列|输入|修饰符--------------- -------------------------- -------- ---------------------------------------------- id |整数| not null default nextval('package_id_seq':: regclass)created_at |带时区的时间戳| not null updated_at |带时区的时间戳| not null title |性格变化(50)|非空描述|文字|状态|布尔值|不是零价格数字(8,2)| not null 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)REFERENCES special(id)DEFERRABLE INITIALLY DEFERRED通过引用:TABLE “claimedpackage” 约束 “claimedpackage_package_id_9e1da358fbb9a46_fk_package_id” 外键(的package_id)参考包(ID)DEFERRABLE INITIALLY DEFERRED TABLE “package_service” 约束 “package_service_package_id_3b0ea08bfcd8da76_fk_package_id” 外键(的package_id)参考包(ID)DEFERRABLE INITIALLY DEFERRED

3 回答

  • 7

    如果从_221421回答没有解决您的问题,这是另一种选择 .

    今天我尝试从Django Model中删除unique_together时遇到了同样的问题(问题的确切关键字) . 我正在使用Django 1.11 .

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

    我尝试在表上找到UNIQUE CONSTRAINT但未找到 .

    所以,我直接从SQL控制台创建UNIQUE CONSTRAINT .

    ALTER TABLE package ADD UNIQUE (speciality, title)
    

    然后我重新运行迁移 .

    希望能帮助到你 .

  • 0

    看起来你正在遇到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

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

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

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

    你总是可以编写自己的数据库后端来规避问题,或者向Django提交一个pull-request!

相关问题