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 的回答很好,但是当方法只做一件事和一件事时,我更喜欢它。就像现在一样,.refresh()需要处理两件事。计算余额和储蓄。我会通过实现该方法进一步分解它,.refresh()但在视图中这样做。(我也将它命名为 refresh_balance 而不是 refresh,refresh 意味着我们刷新整个帐户)。

account.refresh_balance()
account.save()

这使得 for 的逻辑.refresh_balance()可以改变,但.save()会独自去做它最擅长的事情。将模型保存到数据库。

这也将使您的代码不易出错。我们还将遵循 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 回答