在Django中存储相关的模型引用?

时间:2015-10-09 18:35:20

标签: python django django-models orm

我正在为我的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 位是我坚持的部分。如何获取我正在跟踪的特定模型的关联历史模型?是否有一种简单的方法可以在每个子类中存储对它的引用?我想防止代码重复,我认为这是正确的途径,但我坚持这一点。任何帮助将不胜感激。

1 个答案:

答案 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(...)