在Django中使用观察者模式的问题

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,我没有权限安装任何插件.

And*_*dge 9

这可能不是一个可接受的答案,因为它与架构有关,但您是否考虑使用信号通知系统更改?您似乎正在尝试完成信号的设计目标.Django信号具有与Observer模式相同的最终结果功能.

http://docs.djangoproject.com/en/1.1/topics/signals/