Я работаю над сайтом, где продаю товары (один класс Продажа, один класс Продукт). Всякий раз, когда я продаю продукт, я хочу сохранить это действие в таблице истории, и я решил использовать для этого шаблон наблюдателя.
То есть: мой класс Sales является субъектом, а класс History - наблюдателем, всякий раз, когда я вызываю метод 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)
на вид я делаю что-то вроде этого
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, и теперь у меня есть два наблюдателя истории, слушающих Продажи, но я не уверен, что это проблема (черт возьми) Я скучаю по print_r из php).
Что я делаю не так? Когда мне нужно «прикрепить» наблюдателя? Или есть лучший способ сделать это?
Кстати: я использую Django 1.1, и у меня нет доступа для установки каких-либо плагинов.