【发布时间】:2017-11-24 22:24:27
【问题描述】:
TL;DR;在相同的迁移中更改完全不同的字段作为引入多对多字段导致中间表没有UNIQUE约束。
根挑战。
我需要用多对多替换一对多关系。
一步一步。
假设最初我有:
class Test(models.Model):
pass
class Test2(models.Model):
title = models.CharField(max_length=100)
test = models.ForeignKey(Test)
将test2.test改成ManyToMany后
class Test(models.Model):
pass
class Test2(models.Model):
title = models.CharField(max_length=100)
tests = models.ManyToManyField(Test)
并运行 makemigrations/migrate 我得到了新表 test2_test 对 test_id + test2_id 具有唯一约束,这绝对是我所期望的。
但是一旦我想更新另一个字段:
class Test(models.Model):
pass
class Test2(models.Model):
title = models.TextField()
tests = models.ManyToManyField(Test)
而test2_test 没有得到UNIQUE INDEX 的test_id + test2_id。
作为一种解决方法,我终于将不同字段的更改转移到单独的迁移中。
问题
有人知道这种行为的原因吗?
【问题讨论】:
-
我正在使用 SQLite。但相信它与特定的 RDBMS 无关。
-
为什么要获得唯一索引?根据定义,ManyToMany 意味着关系不是唯一的 - 可以有任意数量的
Test2对象与Test对象相关。 -
我真的明白了。但是一旦有额外的变化 - 那我就不会了。
-
实际上没有唯一索引没有多大意义。虽然中间模型上没有其他字段,但我们无法区分与同一对象的关系。比如说,我们有
Family和Human具有多对多关系。如果同一个人与同一个家庭有两次联系,这意味着什么?我们该如何处理?
标签: django django-models many-to-many django-migrations