That was my idea too, but using this way, the pre_save / post_save signals wont be triggered. It seems strange to me to be using the objects manager instead of the model instance directly, no?
Seb Le mardi 21 août 2012 02:11:42 UTC+2, Thomas Orozco a écrit : > > As a followup to the suggestion of MyModel.objects.filter(money__gte = > value, pk = self.pk).update(F...) > > Here's an example: > > We have testapp/models.py: > > from django.db import models > class TestModel(models.Model): > balance = models.IntegerField() > > > >>> from django.db.models import F > >>> TestModel.objects.create(balance = 5) #Pk will be 1 I just create one. > >>> import logging > >>> l = logging.getLogger('django.db.backends') > >>> l.setLevel(logging.DEBUG) > >>> l.addHandler(logging.StreamHandler()) > >>> TestModel.objects.filter(balance__gte = 4, pk = 1).update(balance = > F('balance') - 4) > (0.001) UPDATE "testapp_testmodel" SET "balance" = > "testapp_testmodel"."balance" - 4 WHERE ("testapp_testmodel"."balance" >= 4 > AND "testapp_testmodel"."id" = 1 ); args=(4, 4, 1) > 1 > >>> TestModel.objects.filter(balance__gte = 4, pk = 1).update(balance = > F('balance') - 4) > (0.000) UPDATE "testapp_testmodel" SET "balance" = > "testapp_testmodel"."balance" - 4 WHERE ("testapp_testmodel"."balance" >= 4 > AND "testapp_testmodel"."id" = 1 ); args=(4, 4, 1) > 0 > > > > *So this seems to generate a single SQL statement.* > * > * > *I'm not totally familiar with database administration though, so as** Melvyn > rightly pointed out, it's always better if you can get the extra security > of having an SQL constraint into your dabatase and wrap your queries in a > transaction (as you'll probably be adding a line to the statement if the > withdrawal succeeds).* > * > * > > 2012/8/20 Thomas Orozco <g.orozc...@gmail.com <javascript:>> > >> A few suggestions : >> >> Circumvent the problem with smarter design: don't store the money on the >> object, make the user's money the sum of all their transactions (credit - >> debit). >> You get lesser performance, but you also get history! >> >> Maybe you could try (not sure about that): >> >> MyModel.objects.filter(money__gte = value, pk = self.pk).update(F...) >> >> and inspect the return value (number of updated rows!). >> Now, you'd need to make sure django does that in a single statement. >> >> If that doesn't work, I think update is the way to go anyway, but it >> might get a bit messy. >> >> F... is an F object whose syntax I don't have off the top of my head. >> Le 20 août 2012 18:54, "Sebastien Flory" <sfl...@gmail.com <javascript:>> >> a écrit : >> >> Hi everyone, >>> >>> I'm looking for the proper django way to do an update of an attribute on >>> my model instance, but only if the attribute current value is checked >>> agains't a condition, in an atomic way, something like this: >>> >>> def use_money(self, value): >>> begin_transaction() >>> real_money = F('money') >>> if real_money >= value: >>> self.money = F('money') - value >>> self.save() >>> end_transaction() >>> >>> I want to make sure that I avoid race condition so money never goes >>> below 0. >>> >>> Can you help me out? >>> >>> Thanks, >>> >>> Sebastien >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Django users" group. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msg/django-users/-/hr1fBuAcX3kJ. >>> To post to this group, send email to django...@googlegroups.com<javascript:> >>> . >>> To unsubscribe from this group, send email to >>> django-users...@googlegroups.com <javascript:>. >>> For more options, visit this group at >>> http://groups.google.com/group/django-users?hl=en. >>> >> > -- You received this message because you are subscribed to the Google Groups "Django users" group. To view this discussion on the web visit https://groups.google.com/d/msg/django-users/-/x8CZ3-F30PsJ. 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.