我想更新用户余额。要执行此操作,我必须保存帐户对象,请考虑以下视图:
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这不是一个悬而未决的问题,我很清楚我正在尝试做什么以及我正在追求什么。谢谢:))
答案 0 :(得分:4)
Stalk的答案很好,但是当方法只做一件事而且只做一件事时,我更喜欢它。
就像现在一样,.refresh()
负责两件事。计算平衡和节省。
我会通过实现.refresh()
方法进一步细分,但在视图中执行此操作。 (另外我将它命名为refresh_balance而不是刷新,刷新意味着我们刷新整个帐户)。
account.refresh_balance()
account.save()
这使得.refresh_balance()
的逻辑可以改变,但.save()
将保持独立以做它最好的事情。将模型保存到数据库中。
这也将使您的代码不易出错。 我们还将遵循Python的禅宗:“明确胜过隐性”。
答案 1 :(得分: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()