ple*_*ong 4 python django design-patterns observer-pattern
我正在一个销售产品的网站上工作(一类销售,一类产品).每当我销售产品时,我想在History表中保存该操作,并且我决定使用观察者模式来执行此操作.
那就是:我的类Sales是主题而History类是观察者,每当我调用Sales类的save_sale()方法时,我都会通知观察者.(我决定使用这种模式,因为稍后我也会发送电子邮件,通知管理员等)
这是我的主题类(Sales类从此扩展)
class Subject:
_observers = []
def attach(self, observer):
if not observer in self._observers:
self._observers.append(observer)
def detach(self, observer):
try:
self._observers.remove(observer)
except ValueError:
pass
def notify(self,**kargs):
for observer in self._observers:
observer.update(self,**kargs)
Run Code Online (Sandbox Code Playgroud)
在视图上我做这样的事情
sale = Sale()
sale.user = request.user
sale.product = product
h = History() #here I create the observer
sale.attach(h) #here I add the observer to the subject class
sale.save_sale() #inside this class I will call the notify() method
Run Code Online (Sandbox Code Playgroud)
这是History的更新方法
def update(self,subject,**kargs):
self.action = "sale"
self.username = subject.user.username
self.total = subject.product.total
self.save(force_insert=True)
Run Code Online (Sandbox Code Playgroud)
它第一次工作正常,但是当我尝试再次销售时,我收到一条错误消息,说由于主键约束我无法插入历史记录.
我的猜测是,当我第二次调用视图时,第一个观察者仍然在Subject类中,现在我有两个历史观察者正在听销售,但我不确定这是不是问题(天哪,我想念了来自php的print_r).
我究竟做错了什么?我何时必须"附加"观察者?或者有更好的方法吗?
顺便说一句:我正在使用Django 1.1,我没有权限安装任何插件.
这可能不是一个可接受的答案,因为它与架构有关,但您是否考虑使用信号通知系统更改?您似乎正在尝试完成信号的设计目标.Django信号具有与Observer模式相同的最终结果功能.
http://docs.djangoproject.com/en/1.1/topics/signals/