【问题标题】:migrating from one-to-many to many-to-many: interm. table does not have UNIQUE constraint从一对多迁移到多对多:interm。表没有 UNIQUE 约束
【发布时间】: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_testtest_id + test2_id 具有唯一约束,这绝对是我所期望的。

但是一旦我想更新另一个字段:

class Test(models.Model):
    pass


class Test2(models.Model):
    title = models.TextField()
    tests = models.ManyToManyField(Test)

test2_test 没有得到UNIQUE INDEXtest_id + test2_id

作为一种解决方法,我终于将不同字段的更改转移到单独的迁移中。

问题

有人知道这种行为的原因吗?

【问题讨论】:

  • 我正在使用 SQLite。但相信它与特定的 RDBMS 无关。
  • 为什么要获得唯一索引?根据定义,ManyToMany 意味着关系不是唯一的 - 可以有任意数量的 Test2 对象与 Test 对象相关。
  • 我真的明白了。但是一旦有额外的变化 - 那我就不会了。
  • 实际上没有唯一索引没有多大意义。虽然中间模型上没有其他字段,但我们无法区分与同一对象的关系。比如说,我们有 FamilyHuman 具有多对多关系。如果同一个人与同一个家庭有两次联系,这意味着什么?我们该如何处理?

标签: django django-models many-to-many django-migrations


【解决方案1】:

实际上是reported to django team 这是已知的错误,已经在即将发布的 v.2 版本中修复。

在此之前,应使用解决方法,将 ManyToMany 字段与任何其他模型的更改分开引入。

【讨论】:

    猜你喜欢
    • 2018-06-29
    • 2011-09-10
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多