【问题标题】:Detect if a model has changed before calling save in Django在 Django 中调用 save 之前检测模型是否已更改
【发布时间】:2011-07-11 13:43:45
【问题描述】:

我有一个数据库模型,它正在根据远程数据的变化(通过 HTML 抓取器)进行更新。

我想维护一个名为 changed 的字段 - 一个时间戳,表示该模型的值上次更改的时间(请注意,这与 auto_now 不同,因为每次模型的 @ 都会更新这些字段987654324@方法被调用)。

这是我的问题:

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

【问题讨论】:

标签: python django django-models


【解决方案1】:

此库具有跟踪 FK 查找。

https://github.com/mmilkin/django_dirty_bits

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果您想知道哪些字段发生了变化:form.changed_data
    • 谢谢,这两个都需要:)
    【解决方案3】:

    http://code.activestate.com/pypm/django-dirtyfields/

    跟踪 django 模型实例上的脏/更改字段。

    【讨论】:

      【解决方案4】:

      您可以在保存记录值时尝试计算它们的校验和。然后当你稍后阅读它时,重新计算校验和,看看它是否发生了变化。也许是 Python zlib 标准模块中的 crc32 函数。 (我不确定这会有什么样的性能。所以你可能想调查一下。)

      【讨论】:

      • 有趣。是否有一种简单的方法可以查看对象的全部数据,以便轻松对其进行校验和?一个对象的两个相同(具有相同的字段值)实例是否有可能具有不同的“数据”(我们的校验和函数读取的输入)。
      • 1.我将使用的方法是简单地获取所有字段数据,将每个数据转换为字符串,将它们全部连接起来,然后对其进行校验和。 2.理论上有可能让两个不同数据的实例得出相同的校验和,但这种可能性很小。如果您真的对此感到担忧,您可以使用加密哈希函数,这几乎是不可能的;但计算起来会更昂贵。
      • @dappawit 您还应该考虑串联的顺序,这可能会导致您的逻辑出现问题。哈希(“a=1b=2c=3”)!=哈希(“a=1c=3b=2”)。无论如何,另一种好方法。
      【解决方案5】:

      听起来你想要的是信号:http://docs.djangoproject.com/en/1.2/topics/signals/

      您可以使用post_save 信号来更新另一个模型中的相关字段以存储先前的值。然后在下一轮你就有了比较的东西。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多