4

djangoは主キーの一意性を強制しますか?

ここのドキュメントはそう示唆しているようですが、クラスを次のように定義すると:

class Site(models.Model):
    id = models.IntegerField(primary_key=True)

テストケースでこの制約をテストします。

class SiteTestCase(TestCase):
    def setUp(self):
        self.site = Site(id=0, name='Site')
        self.site.save()

    def tearDown(self):
        self.site.delete()

    def test_unique_id(self):
        with self.assertRaises(IntegrityError):
            badSite = Site(id=0, name='Bad Site')
            badSite.save()
            badSite.delete()

テストは失敗します。

通常のフィールド(primary_key = False、unique = True)でテストすると、例外が正しく発生します。idフィールドにunique=Trueを設定しても、結果は変わりません。

ここで欠落しているprimary_keyフィールドについて何かありますか?

必要に応じて、私のデータベースバックエンドはMySQLです。

4

1 に答える 1

3

テスト方法が間違っています。ここで行っているのは、すでに使用されている主キーを指定しているため、既存のインスタンスを更新することです。そのように変更しsaveますforce_insert

def test_unique_id(self):
        with self.assertRaises(IntegrityError):
            badSite = Site(id=0, name='Bad Site')
            badSite.save(force_insert=True)
            badSite.delete()

djangoのドキュメントでは、 djangoがUPDATEとINSERTのどちらを使用するかを知る方法について説明しています。そのセクションを読む必要があります。

djangoはすでに自動主キーをサポートしていることをご存知ですか?詳細については、ドキュメントを参照してください。

于 2013-01-22T23:23:16.070 に答える