I think you could always send the signals yourself.
Wrap that along in a model method, and I don't see any issue with using the
manager!
Le 21 août 2012 10:18, "Sebastien Flory" <[email protected]> a écrit :
> 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 <[email protected]>
>>
>>> 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" <[email protected]> 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<https://groups.google.com/d/msg/django-users/-/hr1fBuAcX3kJ>
>>>> .
>>>> To post to this group, send email to [email protected].
>>>> To unsubscribe from this group, send email to django-users...@**
>>>> googlegroups.com.
>>>> For more options, visit this group at http://groups.google.com/**
>>>> group/django-users?hl=en<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 [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> 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 post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en.