更改模型字段时更新django任务

时间:2019-09-26 13:42:22

标签: django django-models django-signals

我有一个django模型,其中包含有关应针对特定预订运行特定任务(电子邮件提醒)的详细信息。

看起来有点像这样:-

class Task(models.Model):
    PENDING = 'pending'
    IN_PROGRESS = 'in_progress'
    COMPLETE = 'complete'
    STATES = (
        (PENDING, 'Pending'),
        (IN_PROGRESS, 'In Progress'),
        (COMPLETE, 'Complete')
    )

    run_at = models.DateTimeField()
    state = models.CharField(max_length=50, choices=STATES, default=PENDING)

    class Meta:
        ordering = ['run_at']

更改预订日期时,我希望更新相应任务的运行时间。

据我所知,有几种方法可以做到这一点:-

  1. 在查看代码中。
  2. 在任务模型的保存方法中。
  3. 使用信号。

通常,我认为使用视图代码最有意义-这样更明确。但是我使用的代码很旧,可以从各种地方以各种方式更改预订日期,但我不敢肯定我可以100%确定我已经抓住了每个地方这可能发生。如果我错过了任何任务,那么在这种情况下任务将不会更新。

此外,如果其他人添加了更改预订日期的代码,他们将必须知道更新任务。

那么使用save方法会更有意义吗?或者只是尝试并尽我所能,找到可以更改预订日期的所有地方?

1 个答案:

答案 0 :(得分:0)

信号是为此类任务而设计的,对于您而言,我相信使用信号是最好的方法。

如您所建议,使用视图代码带来了必须在多个位置更新代码的问题,并且将来的开发人员在添加更改预订日期的代码时也必须牢记这些约束。因此,这不是解决此问题的好方法。

重写Task模型的save方法也是可行的解决方案,但是由于信号是为此类任务设计的,因此这是一个更好的选项代码风格。