4

ユーザーの残高を更新したい。現在これを行うには、Accountオブジェクトを保存する必要があります。次のビューを検討してください。

def refresh_balance(request):
    """
    Balance Refresh.

    The balance shown on every page is a cached balance for performance reasons.
    To get the real balance you need to re-save the account object which will refresh
    the cached value in the database.

    """
    page = request.GET['redirect']
    account = Account.objects.get(user=request.user)
    account.save()
    message_user(
        request.user,
        "Account Balance Refreshed.")
    return HttpResponseRedirect(page)

model.py には、脚の作業を行う次のクラス メソッドがあります。

def save(self, *args, **kwargs):
        self.balance = self._balance()
        return super(Account, self).save(*args, **kwargs)


    def _balance(self):
        aggregates = self.transactions.aggregate(sum=Sum('amount'))
        sum = aggregates['sum']
        return D('0.00') if sum is None else sum

これは私には面倒に見えます。再保存するために再保存しています(それが理にかなっている場合)。理想的には、必要なときにいつでもビュー内で refresh() を呼び出すだけです。私は Django の専門家ではないので、これをより適切に処理する方法についてアドバイスが必要です。

私はおそらく静的メソッドを見てきましたか?

def _balance(self):
        aggregates = self.transactions.aggregate(sum=Sum('amount'))
        sum = aggregates['sum']
        return D('0.00') if sum is None else sum

    @staticmethod
    def update_balance(model):
        model.balance = unsure here as I need 'self'? 

Account.update_balance(Account)次に、 ?????を呼び出すだけです。

何かアドバイス?PSこれは未解決の質問ではありません。私が何をしようとしているのか、何を求めているのかは明らかです。ありがとう :)

4

2 に答える 2

4

Stalk の答えは良いですが、私はメソッドが 1 つのことだけを行う場合の方が好きです。今のように、.refresh()2 つのことを処理します。残高の計算と貯蓄。メソッドを実装することでさらに分割し.refresh()ますが、ビューではこれを行います。(また、refresh の代わりに refresh_balance という名前を付けます。refresh は、アカウント全体を更新することを意味します)。

account.refresh_balance()
account.save()

これにより、 のロジックを.refresh_balance()変更できる.save()ようになりますが、最適な処理を行うために は放置されます。モデルをデータベースに保存します。

これにより、コードにバグが発生しにくくなります。また、The Zen of Python に従います: 「明示的は暗黙的よりも優れています」。

于 2013-05-07T10:47:23.767 に答える
2

たとえば、次のようなカスタム モデル メソッドを簡単に作成できますrefresh

class Account(models.Model):
    # ... some fields

    def refresh(self):
        # do needed stuff
        self.balance = self._balance()
        self.save()

そして、それを呼び出すだけです:

# ...
account = Account.objects.get(user=request.user)
account.refresh()
于 2013-05-07T10:25:05.720 に答える