I would split the model into two fields, date and counter.

That way, you can use the F() function easily, instead of having to do
the calculation in the code. See
http://docs.djangoproject.com/en/dev/topics/db/queries/#filters-can-reference-fields-on-the-model
for help on how to add 1 with a query.

Finally, when displaying the number, just output:

"%s/%s" % (date, counter)

Hope that helps,

Silvio

On May 8, 2:44 pm, Adrián Ribao <ari...@gmail.com> wrote:
> Hello,
>
> I have a question about transactions and thread safe applications.
>
> I have an invoice app, where I have a model like this:
>
> class Counter(models.Model):
>    client = models.ForeignKey(Client)
>    number = models.CharField(max_length=10, db_index=True)
>    class Meta:
>         unique_together = (("client", "number"),)
>
> Where number is the number of the invoice: "2010/321"
>
> What I need is to create a view that takes the last invoice number of
> a client, parse it and add 1. ie: "2010/321" -> "2010/322"
>
> I have something like this:
>
> @transaction.commit_on_success
> def increment_counter(name, client):
>     counter = Counter.objects.filter(client=client).order_by('-id')[0]
>     #Step 2: Parse format and Increment the counter
>     ....
>     newcounter = "2010/322"
>     counter.count = newcounter
>     #Step 3: Save the new counter
>     counter.save()
>
> I don't know if this is the best approach.
>
> Imagine that when the first thread (thread1) is in step2, the second
> thread (thread2) just inserted a new value in the database, so the
> counter is already on "2010/322" but thread1 will try to write the
> same value. It will fail because there is already a row with that
> value in the ddbb.
>
> How can I solve this problem? Can I use the F() function for this?
> Should I use SQL "SELECT ... FOR UPDATE" ?
>
> Thank you very much,
>
> Adrian Ribao
>
> --
> 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 
> athttp://groups.google.com/group/django-users?hl=en.

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