I don't know if this will make you happy but when I researched this some 
months ago I found no good solution. 
During my search I came upon the following pages that sort of relate to 
this... 

   - http://github.com/dcramer/django-idmapper
   - 
   
http://appengine-cookbook.appspot.com/recipe/high-concurrency-counters-without-sharding/
   - http://pastie.org/615863
   - 
   
http://stackoverflow.com/questions/3522827/handling-race-condition-in-model-save-django
   
I ended up using something similar to the stackoverflow solution.

I needed to generate a new number per "produced_at" date in a model called 
Entity and ended up with the following custom .save method.
This is a pretty rough copy-paste so things might not work out of the box 
but the principle is there. 

class Entity(models.Model):
    ...
    created_at = models.DateTimeField(auto_now_add=True)
    produced_at = models.DateField(default=datetime.now)
    number = models.PositiveIntegerField(default=1)
    
    class Meta:
        unique_together=(('produced_at', 'number'))

    def save(self, *args, **kwargs):
        if self.id: #do a normal save
            super(Entity, self).save(*args, **kwargs)
            return
        while not self.id:
            try:
                max = 
Entity.objects.filter(produced_at=self.produced_at).aggregate(Max('number'))
                if max['number__max']:
                    self.number = max['number__max']+1
                else:
                    self.number=1
                #Trying to save with number = self.number
                super(Entity, self).save(*args, **kwargs)
            except IntegrityError:
                # conflicting number, chill out and try again
                sleep(uniform(0.1, 0.6)) #chill out, then try again
                # try again then

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@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