【问题标题】:Django Model auto modified date issueDjango 模型自动修改日期问题
【发布时间】:2019-09-23 01:57:09
【问题描述】:

我有一个包含这两个字段的基本模型 -

last_synced = models.DateTimeField(null=True, editable=False)
modified = models.DateTimeField(auto_now=True)

last_synced 默认为 null,并且每次更新模型时都会更新修改日期。 我的模型管理器中有一个 get_syncable_models,它返回所有行,修改日期大于 last_synced 日期

def get_syncable_models(self):
    return self.filter(
        Q(modified__gt=F('last_synced')) |
        Q(last_synced__isnull=True),
        reviewed=True,
    )

get_syncable_models 函数由批处理调用,并使用 last_synced = timezone.now() 更新所有模型。 但是,虽然保存修改的日期大于 last_synced 日期(因为 Django 框架中的 timezone.now() 在应用层调用 timezone.now() 后的几毫秒调用),所以 get_syncable_models 函数只有在last_synced 为空。

我在这里考虑两个选项 -

  1. 编写一个保存方法并检查 last_synced 是否已更改,然后在 last_synced 日期上添加一秒。这也意味着我必须修改所有调用保存函数的子类,因为这个类是一个超类。
  2. 在模型中添加一个“同步”标志,批处理作业将其设置为真。编写一个保存方法并检查标志是否为真,然后在 last_synced 日期上加一秒。

如果有更简洁的 Django 解决方案,将不胜感激?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    同步条目的时间对您来说重要吗?还是您只是在使用这些数据来检查条目是否已同步?

    如果最后一个问题为真,我会将其切换为布尔字段"is_synced"。如果您的数据库增长,使用两列来确定某些内容是否同步可能会非常昂贵。

    现在,如果您真的想将该列保留为日期字段,因为它对您有用,另一种选择是检查 modifiedlast_synced 之间的差异是否在 1 分钟的时间范围内.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 2014-08-09
      相关资源
      最近更新 更多