J'avais une clé primaire personnalisée qui doit être configurée sur des données particulières dans un modèle.
Ce n'était pas suffisant, car une tentative d'insertion d'un numéro en double a réussi. Alors maintenant, quand je remplace primary_key=True
Par unique=True
Cela fonctionne correctement et rejette les numéros en double !!. Mais selon cela document ( qui utilise des champs ).
primary_key=True
Implique null=False
Et unique=True.
Ce qui me rend confus car pourquoi accepte-t-il la valeur en premier lieu avec un
unique=True
Intégré?
Je vous remercie.
Instruction mise à jour:
personName = models.CharField(primary_key=True,max_length=20)
Utilisez un AutoField
avec primary_key
À la place.
Modifier:
Si vous n'utilisez pas de AutoField
, vous devrez calculer/définir manuellement la valeur du champ de clé primaire. C'est assez lourd. Y a-t-il une raison pour laquelle vous avez besoinReportNumber
à la clé primaire? Vous pouvez toujours avoir un numéro de rapport unique sur lequel vous pouvez rechercher des rapports, ainsi qu'une clé primaire entière à incrémentation automatique.
Édition 2:
Lorsque vous dites que les valeurs de clé primaire en double sont autorisées, vous indiquez que ce qui se passe est qu'un enregistrement existant avec la même clé primaire est mis à jour - il n'y a en fait pas deux objets avec la même clé primaire dans la base de données (ce qui ne peut pas se produire ). Le problème réside dans la façon dont la couche ORM de Django choisit de faire un UPDATE
(modifier un enregistrement DB existant) par rapport à un INSERT INTO
(Créer un nouvel enregistrement DB). Consultez cette ligne de 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.
En particulier, cet extrait de code:
manager.using(using).filter(pk=pk_val).exists()
Cela signifie: "Si un enregistrement avec la même clé primaire que ce Model
existe dans la base de données, effectuez une mise à jour." Donc, si vous réutilisez une clé primaire, Django suppose que vous faites une mise à jour et ne déclenche donc pas d'exception ou d'erreur.
Je pense que la meilleure idée est de laisser Django générer une clé primaire pour vous, puis avoir un champ séparé (CharField
ou autre) qui a le unique
contrainte.