我想记录用户所做的动作。在大多数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