Generar ID única en django desde un campo de modelo

Quiero generar una identificación diferente / única por solicitud en django desde el campo de modelos. Hice esto pero sigo teniendo el mismo id.

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 

ACTUALIZACIÓN: Si está utilizando Django 1.8 o superior, @madzohan tiene la respuesta correcta a continuación.


Hazlo asi:

 #note the uuid without parenthesis eyw_transactionref=models.CharField(max_length=100, blank=True, unique=True, default=uuid.uuid4) 

La razón por la que se debe a que con el paréntesis evalúa la función cuando se importa el modelo y esto generará un uuid que se utilizará para cada instancia creada.

Sin paréntesis, solo pasó la función que se necesita llamar para dar el valor predeterminado al campo y se llamará cada vez que se importe el modelo.

También puede tomar este enfoque:

 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 

¡Espero que esto ayude!

desde la versión 1.8 Django tiene UUIDField https://docs.djangoproject.com/en/1.8/ref/models/fields/#django.db.modelsIDIDField

 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 necesita o desea usar una función de generación de ID personalizada en lugar del campo UUID de Django, puede usar un bucle while en el método save() . Para identificadores únicos suficientemente grandes, esto casi nunca resultará en más de una sola llamada db para verificar la singularidad:

 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() 

Esta respuesta de Google Code funcionó para mí:

https://groups.google.com/d/msg/south-users/dTyajWop-ZM/-AeuLaGKtyEJ

añadir:

from uuid import UUID

a su archivo de migración generado.