我正在为我的Django应用程序实现一个简单的历史跟踪机制,其中我关注的模型会覆盖save()
和delete()
方法。在每种方法中,我都会根据需要创建历史对象:
def save(self, *args, **kwargs):
super(MyModel, self).save(*args, **kwargs)
# Create the historical model based on what we were given
h = Historical_MyModel(**{field.attname: getattr(self, field.attname) for field in self._meta.fields})
# Set some other fields as necessary...
h.save()
由于每个save()
和delete()
方法的代码相似,我认为防止键入相同代码的好方法是创建abstract base class以将相似的代码放在一个地点。然而,我正在努力的一件事是如何处理为每个子类创建 Historical_ {Model} 实例(每个 Historical_ {Model} 本质上是原始模型,附加信息,如谁做出更改,何时发生更改等。)。
在我的基类中,我认为该方法看起来像这样:
class HistoryTrackedModel(models.Model):
def save(self, *args, **kwargs):
super(self.model, self).save(*args, **kwargs)
# Create the historical model based on what we were given
h = SOME_HISTORICAL_MODEL_INSTANCE(**{field.attname: getattr(self, field.attname) for field in self._meta.fields})
# Other fields get set ...
h.save()
class Meta:
abstract = True
上面的 SOME_HISTORICAL_MODEL_INSTANCE 位是我坚持的部分。如何获取我正在跟踪的特定模型的关联历史模型?是否有一种简单的方法可以在每个子类中存储对它的引用?我想防止代码重复,我认为这是正确的途径,但我坚持这一点。任何帮助将不胜感激。
答案 0 :(得分:1)
我认为最直接的方法是将值存储为类属性:
class HistoricalFoo(models.Model):
...
class Foo(HistoryTrackedModel):
history_model = HistoricalFoo
....
class HistoryTrackedModel(models.Model):
def save(self):
...
h = self.history_model(...)
另一种方法是以编程方式生成历史模型名称:
class HistoryTrackedModel(models.Model):
def save(self):
...
history_model = globals()["Historical" + self.__class__.__name__]
h = history_model(...)