On Mon, Sep 6, 2010 at 7:19 AM, kmpm <pe...@birchroad.net> wrote:
> I have a project running in a manufacturing industry that is actually
> built upon django.
> In this I need to generate a unique serial, batch or lot number
> (depending on what you would like to call it) that is a running number
> from 0 to whathever for each and every day.
> There is a high risk of concurrency so just finding the previous max
> and then do a +1 before saving is not what I want.
> The important part of the model looks like this...
>
> class ProducedEntity(models.Model):
>    ....
>    production_date = models.DateField(auto_now_add=True)
>    lot_no = models.PositiveIntegerField(default=0)
>
>    class Meta:
>        unique_together = ('production_date', 'lot_no')
>
> Of course I could just save it and see if the .save() call works
> without generating a IntegrityError but that's not elegant.
> Is there a way of generating that number per day in a way that it's
> done when I save the model?
>

UUIDs are your best bet. Even if you generated 100 billion UUIDs a
second for the next 100 years, the chance of one collision would only
be 50% [1].

class ProducedEntity(models.Model):
    ....
    uuid = models.CharField(max_length=36, unique=True)

def _hook_add_uuid(instance, sender, **kwargs):
    import uuid
    if not hasattr(instance, 'uuid') or not instance.uuid:
        instance.uuid = str(uuid.uuid4())

from django.db.models.signals import pre_save
pre_save.connect(_hook_add_uuid, sender=ProducedEntity)


UUIDs can be stored more efficiently than that, its just a big 128 bit
number, so can be stored as 2 long integers. See your DB manual for
more info.

Cheers

Tom

[1] 
http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to