2011-03-09 58 views
20

我有一个数据库模型正在根据远程数据(通过HTML刮板)的更改进行更新。在Django调用保存之前检测模型是否已更改

我想保持一个字段名为changed - 时间戳表示当最后一次,模型的价值从他们以前改变了(注意,这是auto_now不同,因为这些领域的每一个模型的save方法被调用时更新)。

这里是我的问题:

在模型的save方法,有没有检测一个模型实例的当前值是从数据库中的值不同的一个简单的方法?或者,有没有其他方法可以轻松维护changed时间戳?

+0

有没有人有'django-extensions'的经验?他们有一个'TimeStampedModel'类,可以做我正在寻找的东西,但文档不是很有帮助(http://packages.python.org/django-extensions/model_extensions.html) – advait 2011-03-09 02:43:20

回答

3

您可能会尝试在保存记录值时计算校验和。然后,当您稍后阅读它时,请重新计算校验和,看看它是否已更改。也许crc32函数在Python zlib标准模块中。 (我不知道这会有什么样的表现。所以,你可能需要调查。)在一个Django模型实例

+0

有趣。有没有简单的方法来查看整个对象的数据,以便它可以很容易地校验和?有可能两个相同(具有相同字段值)的对象实例具有不同的“数据”(输入由我们的校验和函数读取)。 – advait 2011-03-09 07:25:17

+0

1.我会使用的方法是简单地获取所有字段数据,将每个字段数据转换为字符串,并将其全部连接起来,然后进行校验和。 2.理论上可能有两个具有不同数据的实例提供相同的校验和,但这是不太可能的。如果你真的担心这一点,你可以使用一个密码散列函数,其中几乎不可能;但计算起来会更昂贵。 – dappawit 2011-03-09 19:52:34

+0

@dappawit你应该考虑连接的顺序,这可能会导致你的逻辑问题。散列(“a = 1b = 2c = 3”)!=散列(“a = 1c = 3b = 2”)。无论如何,另一个好方法。 – Chris 2013-06-27 20:05:02

34

如果通过表单保存实例,则可以检查form.has_changed()

+13

如果你想知道哪个字段发生了变化:'form.changed_data' – 2012-06-10 06:46:22

+0

谢谢,需要这两个:) – Lee 2012-11-28 11:21:44