[英]Looking for a better OOP approach
我想更新用户余额。 当前要执行此操作,我必须保存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:这不是一个开放的问题,很明显,我在尝试做什么以及我在做什么。 谢谢 :)
Stalk的答案很好,但是当方法只做一件事和一件事时,我更喜欢它。 现在, .refresh()
会处理两件事。 计算余额和节省。 我将通过实现.refresh()
方法来进一步分解它,但在视图中这样做。 (我也将其命名为refresh_balance而不是refresh,refresh意味着我们将刷新整个帐户)。
account.refresh_balance()
account.save()
这使得.refresh_balance()
的逻辑可以更改,但是.save()
会被留下来做最好的事情。 将模型保存到数据库。
这也将使您的代码不易出现错误。 我们还将遵循“ The Zen of Python”(Python之禅)的用法:“显式优于隐式”。
创建自定义模型方法很容易,例如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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.