存档Django模型

时间:2014-02-04 05:07:05

标签: python django cron foreign-keys

我正在创建一个定期销售商品的在线订单系统(蔬菜盒的送货上门)。我有一个'订单'模型(简化)如下:

class BoxOrder(models.Model):
    customer = models.ForeignKey(Customer)
    frequency = models.IntegerField(choices=((1, "Weekly"), (2, "Fortnightly)))
    item = models.ForeignKey(Item)
    payment_method = models.IntegerField(choices=((1, "Online"), (2, "Free)))

现在,我的“客户”可以更改订单的频率,或者出售的“项目”(比如“胡萝卜”),甚至可以一起删除订单。

我想要做的是为每周处理的所有订单创建每周“备份”,这样我就可以看到每周销售的所有订单的历史图表。将订单存档到另一个表/数据库的问题是,如果由于某种原因删除了一个项目(比如说我不再销售胡萝卜),那么由于ForeignKeys

,该存档的BoxOrder将变为无效

使用Django创建归档系统的最佳解决方案是什么 - 以便历史记录中每周的订单在Django admin中可见,并且它们是“静态的”(即与是否删除任何其他对象无关)? 我考虑过创建一个新的“扁平”BoxOrderArchive模型,然后使用cron作业移动给定周的订单,例如:

class BoxOrderArchive(models.Model):
    customer_name = models.CharField(max_length=20)
    frequency = models.IntegerField()
    item_name = models.CharField() # refers to BoxOrder.item.name
    item_price = models.DecimalField(max_digits=10, decimal_places=2) # refers to BoxOrder.item.price
    payment_method = models.IntegerField()

但我觉得这可能是一项额外的工作。在我走这条路之前,知道是否有人有任何其他解决方案会很棒吗?

由于

2 个答案:

答案 0 :(得分:2)

这是一个相当广泛的话题,我不会专门回答你的问题,但我给你的建议是不要删除或移动任何东西。您可以为名为Itemis_deleted的{​​{1}}或类似内容添加一个boolan字段,并在删除项目时使用该标记。这样你就可以

  • 保留is_active s,
  • 对非活动项目有不同的表示
  • 还原以及先前已删除的ForeignKey(例如,您可能希望在几个月后再次销售胡萝卜 - 这样您的统计数据将在一年中保持一致)

Item模型也是如此。不要将行删除到不同的表格,只需添加BoxOrder字段并将其设置为is_archived即可。

答案 1 :(得分:2)

所以,在仔细研究这个问题之后,我认为对我来说最好的解决方案是创建对象的“扁平”版本,取消引用任何现有对象,并将其保存在数据库中。

原因是我的'BoxOrder'对象每周都会更改(因为客户编辑了他们的地址,项目,成本等。跟踪所有这些变化是非常困难的。 另外,除了将数据显示给网站用户之外,我不需要对数据执行任何操作。

基本上我想要做的是创建一个快照,而现有的工具都不是我想要的。话虽如此,其他人可能有不同的优先级,所以这里有一个有用的链接列表:

[1] SO question regarding storing a snapshot/pickling model instances

[2] Django Simple History Docs - 在每次创建/更新/删除时存储模型状态

[3] Django Reversion Docs - 允许还原模型实例

关于[2]和[3]的讨论,请参阅关于Serafim答案的评论