web-dev-qa-db-fra.com

comment utiliser UUID dans Django

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!

35
Chad Crowe

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.

68
Alasdair

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.

6
Sylvestre

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) 
5
Rahul Gupta

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 .

0
Jatin Goyal