web-dev-qa-db-ja.com

djangoの主キーと一意キー

モデル内の特定のデータに設定する必要があるカスタムの主キーがありました。

重複した番号を挿入する試みが成功したため、これでは不十分でした。したがって、primary_key=Trueunique=Trueに置き換えると、正しく機能し、重複する番号が拒否されます!!。しかし、これによれば ドキュメントフィールドを使用しています)。

primary_key=Truenull=Falseおよびunique=True.を意味します

なぜunique=Trueが組み込まれているのに、そもそもなぜ値が受け入れられるのか、と戸惑います。

ありがとうございました。

更新されたステートメント:

   personName = models.CharField(primary_key=True,max_length=20)
17
Nagaraj Tantri

代わりに、_primary_key_とともに AutoField を使用してください。

編集:

AutoFieldを使用しない場合は、主キーフィールドの値を手動で計算または設定する必要があります。これはかなり面倒です。あなたがあなたがReportNumberを主キーに必要とする理由はありますか?レポートのクエリを実行できる一意のレポート番号と、自動インクリメントする整数の主キーを使用することもできます。

編集2:

重複する主キー値が許可されていると言う場合、何が起こっているかは、同じ主キーを持つ既存のレコードが更新されることを示します-実際には、データベース内に同じ主キーを持つ2つのオブジェクトはありません(これは起こり得ません) )。問題は、DjangoのORMレイヤーがUPDATE(既存のDBレコードを変更する)と_INSERT INTO_(新しいDBレコードを作成する)のどちらを行うかを選択する方法にあります。 Django.db.models.base.Model.save_base()からこの行をチェックしてください:

_if (force_update or (not force_insert and
        manager.using(using).filter(pk=pk_val).exists())):
    # It does already exist, so do an UPDATE.
_

特に、このコードスニペット:

_manager.using(using).filter(pk=pk_val).exists()
_

これは、「このModelと同じ主キーを持つレコードがデータベースに存在する場合、更新を行います。」したがって、主キーを再利用する場合、Djangoは、更新を行うと想定しているため、例外やエラーは発生しません。


Djangoで主キーを生成し、次にCharFieldが含まれる別のフィールド(uniqueまたは何でも)を作成することをお勧めします。制約。

17
mipadi