モデル内の特定のデータに設定する必要があるカスタムの主キーがありました。
重複した番号を挿入する試みが成功したため、これでは不十分でした。したがって、primary_key=True
をunique=True
に置き換えると、正しく機能し、重複する番号が拒否されます!!。しかし、これによれば ドキュメント (フィールドを使用しています)。
primary_key=True
はnull=False
およびunique=True.
を意味します
なぜ
unique=True
が組み込まれているのに、そもそもなぜ値が受け入れられるのか、と戸惑います。
ありがとうございました。
更新されたステートメント:
personName = models.CharField(primary_key=True,max_length=20)
代わりに、_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
または何でも)を作成することをお勧めします。制約。