Générer un id unique dans django à partir d'un champ de modèle
Je veux générer un id différent / unique par requête dans django à partir du champ modèles. Je l'ai fait mais je continue à avoir le même identifiant.
class Paid(models.Model):
user=models.ForeignKey(User)
eyw_transactionref=models.CharField(max_length=100, null=True, blank=True, unique=True, default=uuid.uuid4()) #want to generate new unique id from this field
def __unicode__(self):
return self.user
4 réponses
UPDATE: Si vous utilisez Django 1.8 ou supérieur, @madzohan a la bonne réponse ci-dessous.
Faites-le comme ceci:
#note the uuid without parenthesis
eyw_transactionref=models.CharField(max_length=100, blank=True, unique=True, default=uuid.uuid4)
La raison en est qu'avec la parenthèse vous évaluez la fonction lorsque le modèle est importé et cela donnera un uuid qui sera utilisé pour chaque instance créée.
Sans Parenthèse vous avez passé juste la fonction nécessaire pour être appelée pour donner la valeur par défaut au champ et elle sera appelée chaque fois que le le modèle est importé.
Vous pouvez également adopter cette approche:
class Paid(models.Model):
user=models.ForeignKey(User)
eyw_transactionref=models.CharField(max_length=100, null=True, blank=True, unique=True)
def __init__(self):
super(Paid, self).__init__()
self.eyw_transactionref = str(uuid.uuid4())
def __unicode__(self):
return self.user
Espérons que cela aide!
Depuis la version 1.8 Django a UUIDField
https://docs.djangoproject.com/en/1.8/ref/models/fields/#django.db.models.UUIDField
import uuid
from django.db import models
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
# other fields
Si vous avez besoin ou souhaitez utiliser une fonction de génération D'ID personnalisée plutôt que le champ UUID de Django, vous pouvez utiliser une boucle while dans la méthode save()
. Pour les identifiants uniques suffisamment grands, cela n'entraînera presque jamais plus d'un seul appel db pour vérifier l'unicité:
urlhash = models.CharField(max_length=6, null=True, blank=True, unique=True)
# Sample of an ID generator - could be any string/number generator
# For a 6-char field, this one yields 2.1 billion unique IDs
def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
def save(self):
if not self.urlhash:
# Generate ID once, then check the db. If exists, keep trying.
self.urlhash = id_generator()
while MyModel.objects.filter(urlhash=self.urlhash).exists():
self.urlhash = id_generator()
super(MyModel, self).save()
Cette réponse du code Google a fonctionné pour moi:
Https://groups.google.com/d/msg/south-users/dTyajWop-ZM/-AeuLaGKtyEJ
Ajouter:
from uuid import UUID
Dans votre fichier de migration généré.