【问题标题】:Archiving model data in Django在 Django 中归档模型数据
【发布时间】:2015-02-27 01:34:00
【问题描述】:

我正在使用一个 django 应用程序,该应用程序的增长超出了我的预期,现在需要存档一些数据,这样它就不会减慢最终的查询速度。我的问题是,存档现有模型的最佳方法是什么?到目前为止,这是我的想法:

1 - 创建继承模型:

class OriginalModel(models.Model):
    ...
    field = models.CharField(etc...)
    ...

class ArchivedModel(OriginalModel):
    pass

2 - 创建一个 post_save 方法,这样每当将某些内容保存到我的原始模型时,它也会创建一个存档实例。

3 - 在我的原始模型上使用 celery 创建一个清除任务,以仅保留相关数据。

但我不确定模型继承是否会按我的预期工作。如果有人对此有任何意见,我将不胜感激。

【问题讨论】:

  • 最佳解决方案取决于您项目的具体细节。一旦我像接受的答案所说的那样做了。在 Django 看来,它使很多事情变得复杂。像试图通过管理界面查找记录一样平庸:如果记录已存档,那么我必须在存档中搜索,如果没有,那么我在主表中搜索。哦,这是可以克服的,但是 ORM 级别的这种分裂很快就会蔓延到各处。随着项目的成熟,我最终恢复到只有一张桌子。您提到的性能问题应该在数据库级别解决。

标签: django python-3.x django-models


【解决方案1】:

在您的代码中来自ArchivedModel 的数据将保留在OriginalModel SQL 表中。在 SQL 级别 ArchivedModel 将是一个表,其中单个 id 字段引用 OriginalModel 表。因此,如果您将在post_save 信号中向ArchivedModel 添加对象,它们将在OriginalModel 中复制:-)

您需要创建abstract base class 并从中继承两个“真实”模型:

class AbstractModel(models.Model):
    ...
    field = models.CharField(etc...)
    ...
    class Meta:
        abstract = True

class OriginalModel(AbstractModel):
    pass

class ArchivedModel(AbstractModel):
    pass

在这种情况下,OriginalModelArchivedModel 将具有具有相同字段集的不同 SQL 表。

【讨论】:

    猜你喜欢
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多