ユーザーが行った操作をログに記録します。ほとんどのオブジェクト指向言語では、とLogoutAction
のようないくつかの子クラスを持つLoggedAction
クラスを使って実装します。その後、LoggedAction
のリストを反復し、仮想継承を使って特定の子の動作を取得することができました。しかしこれは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
のメンバーとして特別な行動を取るべきだと思います)
ここに示したように、データベースでは3つのテーブルとして実装され、LoginActionとLogoutActionは共通のテーブルに結合され、LoggedActionオブジェクトはインスタンス化できます。 LoggedActionを抽象化することができます。 –
@ChrisMorgan 'LoggedAction'抽象クラスを抽象化すると、それらを反復処理することはできません。したがって特に 'LoggedAction.objects.all()'は不可能でしょうか? – knatten
わかりません。実際、私はサブクラスを使ってモデルを繰り返し処理する必要はありませんでした。 –