2017-11-24 1 views
0

TL; DR;多対多フィールドリードの中間テーブルを導入するのと同じ移行で完全に異なるフィールドを変更すると、UNIQUEという制約がありません。1対多から多対多への移行:interm。テーブルにUNIQUE制約がありません

ルートチャレンジ

1対多の関係を多対多に置き換える必要があります。

ステップバイステップ。

が当初想定私が持っている:

class Test(models.Model): 
    pass 


class Test2(models.Model): 
    title = models.CharField(max_length=100) 
    test = models.ForeignKey(Test) 

ManyToMany

class Test(models.Model): 
    pass 


class Test2(models.Model): 
    title = models.CharField(max_length=100) 
    tests = models.ManyToManyField(Test) 

にtest2.testを変更し、makemigrations/migrateを実行した後、私はペアtest_idためにUNIQUE制約を持つ新しいテーブルtest2_testを取得しています+ test2_idそれは間違いなく私が期待しています。

しかし、私はまた、別のフィールドを更新したかったら:

class Test(models.Model): 
    pass 


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

そしてtest2_testtest_id + test2_idためUNIQUE INDEXを得ることはありません。

私はついに、異なるフィールドの変更を別々の移行に移動しました。

質問

誰もがそのような行動の理由を知っていますか?

+0

私はSQLiteを使用しています。しかし、特定のRDBMSには関係しないと考えています。 – skyboyer

+0

ユニークなインデックスを取得するのはなぜですか? ManyToManyという定義は、その関係が一意ではないことを意味します。 'Test'オブジェクトに関連する任意の数の' Test2'オブジェクトが存在する可能性があります。 – solarissmoke

+0

私は実際それを得ています。一度追加の変更があると、私はそうしない。 – skyboyer

答えて

0

実際にはreported to django teamこれは既知のバグであり、今後のv.2リリースで修正されています。

他のモデルの変更とは別に、ManyToManyフィールドを導入する際には回避策を使用する必要があります。

関連する問題