我正在一个网站上销售产品(一类销售,一类产品)。无论何时我销售产品,我都希望将该操作保存在历史记录表中,并决定使用观察者模式来执行此操作。django中使用观察者模式的问题
即:当我调用Sales类的save_sale()方法时,我的类Sales和Subject类都是观察者,我将通知观察者。 (我已经决定使用这种模式,因为以后我还会发送一封电子邮件,通知管理员等)
这是我的主题类(销售类从这个扩展)
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)
在视图上我做这样的事
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
这是历史
def update(self,subject,**kargs):
self.action = "sale"
self.username = subject.user.username
self.total = subject.product.total
self.save(force_insert=True)
的更新方法它第一次正常工作,但是当我尝试进行另一次销售时,出现一个错误,指出由于主键约束而无法插入历史记录。
我的猜测是,当我第二次调用视图时,第一个观察者仍在Subject类中,现在我有两个历史观察者正在倾听Sales,但我不确定这是否是问题天哪我想念从PHP的print_r)。
我在做什么错?我什么时候需要“附加”观察者?或者有更好的方法来做到这一点?
顺便说一句:我正在使用Django 1.1,我无法安装任何插件。
我试过那天。但似乎主体的构造函数从来没有被调用过,我甚至试图用super(Sales,self)从子类的构造函数调用它.__ init __()但我没有运气 – pleasedontbelong 2010-09-13 07:19:23
如果一个基类有一个__init __( )方法,派生类的__init __()方法(如果有的话)必须显式调用它以确保实例的基类部分正确初始化;例如:BaseClass的.__的init __(自我,[参数...]) – dmitko 2010-09-13 07:44:15
http://docs.python.org/reference/datamodel.html#object.__init__ – dmitko 2010-09-13 07:44:47