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
30
demandé sur picomon 2013-06-04 22:38:59

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!

44
répondu Paulo Bu 2016-11-02 08:35:20

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
68
répondu madzohan 2015-06-04 07:31:28

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()
9
répondu shacker 2016-05-21 07:17:21

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é.

1
répondu woodardj 2013-11-06 03:53:24