0

私は3つのモデルを手に入れました(単純化):

class User(models.Model):
...

class PersonalAccount(models.Model):
    user = models.OneToOneField(user)
    balance = MoneyField()   (like float)

class Withdrawal(models.Model):
   date = models.DateField()
   amount = MoneyField()
   client = ForeignKey(User)
   account =ForeignKey(PersonalAccount)

引き出しを保存するたびに、次のことを行う必要があります。

client.PersonalAccount.balance = client.PersonalAccount.balance - withdrawal.amount
client.PersonalAccount.save

そのためにはどの信号を使用すればよいですか? pre_savepost_saveまたはinitもの?デバッグを簡単にしたい。アカウント操作のいずれかが失敗した場合、引き出しは保存されません。また、関係の構文が正しいかどうかもまったくわからないので、誰かがこれについて冷静に説明した場合..

4

1 に答える 1

0

論理的には、取り出したら量を減らさなければなりません。したがって、post_save信号音は適切です。技術的には、pre_saveここでも問題なく使用できます。

ただし、これらは非同期呼び出しであるため、誤動作に注意する必要があります。たとえば、毎分 50 リクエストを実行した場合 (例)、どのリクエストが最初に完了するかはわかりません (django はリクエストの処理順序を保証しません)。ここでは、非同期呼び出しを慎重に管理する必要があります。

または、単にsave()モデル メソッドをオーバーライドして、必要なアクションを実行することもできます。

def save(obj, *args, **kwargs):
    super(ModelClass, self).save(*args, **kwargs)
    # update your persoanl account
    obj.PersonalAccount.save()

これは非同期呼び出しよりも優れています

于 2013-11-10T17:24:48.997 に答える