J'essaie d'obtenir des identifiants uniques pour mes Django objets. Dans Django 1.8 ils ont le UUIDField. Je ne sais pas comment utiliser ce champ pour générer ID uniques pour chaque objet de mon modèle.
Voici ce que j'ai pour UUIDField
import uuid
from Django.db import models
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
class Person(models.Model):
...
unique_id = MyUUIDModel()
Je peux reproduire l'identifiant du modèle UUID, mais chaque fois que je le fais, je reçois exactement le même identifiant. :(. Par exemple:
person = Person.objects.get(some_field = some_thing)
id = person.unique_id.id
id me donne alors le même identifiant à chaque fois. Quel est le problème, comment puis-je résoudre ce problème? Merci de votre aide!
Je ne sais pas pourquoi vous avez créé un modèle UUID. Vous pouvez ajouter le champ uuid directement au modèle Personne.
class Person(models.Model):
unique_id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
Chaque personne devrait alors avoir un identifiant unique. Si vous voulez que l'uuid soit la clé primaire, vous feriez:
class Person(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
Votre code actuel n'a pas ajouté de champ à la personne. Il a créé une instance MyUUIDModel
lorsque vous effectuez MyUUIDModel () et vous l'avez enregistré en tant qu'attribut de classe. Cela n’a aucun sens de faire cela, le MyUUIDModel
sera créé chaque fois que le fichier models.py sera chargé. Si vous voulez vraiment utiliser MyUUIDModel, vous pouvez utiliser un ForeignKey
. Ensuite, chaque personne serait liée à une instance différente de MyUUIDModel.
class Person(models.Model):
...
unique_id = models.ForeignKey(MyUUIDModel, unique=True)
Cependant, comme je l’ai dit plus tôt, l’approche la plus simple consiste à ajouter le champ UUID directement à la personne.
Vous devez utiliser la classe que vous avez créée en tant que sous-classe lorsque vous déclarez votre modèle Person de la manière suivante:
import uuid
from Django.db import models
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
class Person(MyUUIDModel):
...
De cette façon, Person devient une sous-classe de MyUUIDModel et hérite de la définition de son champ id.
Vous pouvez directement ajouter le champ id
en tant que UUIDField
dans le modèle Person
. Il n'y a pas besoin de MyUUIDModel
séparé.
Je pense que vous l'avez confondu avec le MyUUIDModel
utilisé dans le exemple de UUIDField où le id
est un UUIDField
. Vous pouvez simplement utiliser le code ci-dessous et il utilisera UUIDs
pour id
.
import uuid
from Django.db import models
class Person(models.Model):
...
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
Pour utiliser l'UUID dans Django pour un nouveau modèle , voir Django Docs .
Cependant, si vous souhaitez l’utiliser pour le modèle existant (avec unique = True) ayant les données correspondantes , vous ne pourrez pas le faire directement par la documentation ci-dessus. Cela créera des erreurs de migration . Pour le faire sans perdre les données, suivez toutes les étapes de cette Documentation Django .