【发布时间】:2012-02-18 19:07:55
【问题描述】:
我想记录用户的操作。在大多数 OO 语言中,我会通过 LoggedAction 类来实现这一点,它有几个子类,如 LoginAction 和 LogoutAction。然后我可以遍历LoggedActions 的列表,并通过虚拟继承获得特定的子行为。但是,这不适用于 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() 得到的是LoggedAction 对象的列表,该对象具有loginaction 成员或logoutaction 成员。 (输出是u'2012-02-18 18:47:09.105840: knatten 之类的消息列表,没有提及操作。)
有没有一种理智的方法来获得我所追求的行为,还是我试图在这里应用错误的范例? (我想我是,我应该只是在LoggedAction 中作为成员进行具体操作)
【问题讨论】:
-
意识到,正如您在此处展示的那样,它将在数据库中实现为三个表,LoginAction 和 LogoutAction 连接在一个公共表上,并且可以实例化 LoggedAction 对象。您可能希望将 LoggedAction 抽象化。
-
@ChrisMorgan 如果我将
LoggedAction抽象化,我将无法遍历它们,对吗?所以特别是LoggedAction.objects.all()是不可能的? -
不确定;事实上,我从来没有理由用子类迭代模型。
标签: python django oop inheritance virtual-inheritance