我想記錄用戶所做的動作。在大多數OO語言中,我將通過LoggedAction
類實現此功能,其中有幾個子類,如LoginAction
和LogoutAction
。然後我可以遍歷一個列表LoggedAction
s,並通過虛擬繼承來獲取特定的子行爲。但是,這不適用於使用Django模型。有沒有在Django模型中模擬虛擬繼承的理智方法?
例models.py
:
class LoggedAction(models.Model):
user = models.ForeignKey(User)
timestamp = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
return "%s: %s %s" % (unicode(self.timestamp), unicode(self.user), unicode(self.action()))
def action(self):
return ""
class LoginAction(LoggedAction):
def action(self):
return "logged in"
class LogoutAction(LoggedAction):
def action(self):
return "logged out"
然後,我喜歡做[unicode(l) for l in LoggedAction.objects.all()]
並獲得像u'2012-02-18 18:47:09.105840: knatten logged in'
信息的列表。
正如預期的那樣,這是行不通的,因爲我從all()
得到的是具有或者一個loginaction
成員或成員logoutaction
對象LoggedAction
的列表。 (輸出是一樣u'2012-02-18 18:47:09.105840: knatten
消息列表,沒有提到的動作。)
是否有一個健全的方式拿到後,我的行爲,還是我想在這裏應用錯誤的範例? (我想我是,我應該只是作爲LoggedAction
成員的具體行動)
認識到,正如您在此處顯示的那樣,它將在數據庫中以三個表的形式實現,其中LoginAction和LogoutAction加入到公共表中,並且可以實例化LoggedAction對象。您可能想要使LoggedAction抽象。 – 2012-02-18 22:11:53
@ChrisMorgan如果我使'LoggedAction'抽象,我無法迭代它們,對吧?所以特別是'LoggedAction.objects.all()'將不可能? – knatten 2012-02-18 22:15:06
不確定;事實上,我從來沒有理由用一個子類迭代模型。 – 2012-02-18 22:20:32