当更新同一模型中的另一个特定字段时,如何更新Django models.DateTimeField?

时间:2016-06-16 19:04:02

标签: django datetime django-models

我在模型中有两个字段:

is_active = models.BooleanField(default=False)
active_from = models.DateTimeField(blank=True)

is_active设置为True时,我希望将active_from更新为当前日期时间。

我该怎么做呢?如果有一个更简洁的方法可以在一个领域做到这一点,我愿意接受替代方案。

谢谢!

编辑:我想在模型中包含这个以保持封装的东西。这将是API的一部分。

4 个答案:

答案 0 :(得分:4)

执行此操作的一种方法是在自定义模型上定义<div class='input-group'> <input type="text" ng-model="selected" uib-typeahead="state for state in states" class="form-control" /> <span class="input-group-addon" ng-click="selected=''"> X </span> </div> 方法,以查找save()中的更改。没有简单的方法可以实现此目的:您需要通过定义自定义is_active方法手动保存is_active值的先前状态。它可能看起来像这样:

__init__

This question有一些可能有帮助的答案。

答案 1 :(得分:2)

这是我到目前为止拼凑的内容。这似乎是Django最常用的方式,但如果没有,我很乐意予以纠正。

from django.db.models.signals import pre_save, post_save
from django.dispatch import receiver
import datetime

class MyModel(models.Model):
    is_active = models.BooleanField(default=False)
    active_from = models.DateTimeField(blank=True)

# Set active_from if active is set in an update
@receiver(pre_save, sender=MyModel)
def set_active_from_on_update(sender, instance, update_fields, **kwargs):
    if 'is_active' in update_fields and instance.is_active is True:
            instance.active_from = datetime.now()

# Set active_from if active is set on create
@receiver(post_save, sender=MyModel)
def set_active_from_on_create(sender, instance, created, **kwargs):
    if created and instance.is_active is True:
        instance.active_from = datetime.now()

我的推理:update_fields pre_save似乎是基于特定字段更新的任何逻辑的正确位置,但pre_save不知道instance是否为数据库中的新条目与否,因此需要post_save才能使用create布尔值。

我想我也可以取消is_active并将active_from设置为null当它不活跃时,但这似乎并不安全。

答案 2 :(得分:1)

当您同时切换is_active更新active_from时。

例如:

def toggle_user_active_and_update(request, *a, **kw):
    request.user.is_active = !request.user.is_active
    request.user.active_from = datetime.datetime.now()
    request.user.save()

答案 3 :(得分:1)

另一种选择是来自FieldTrackerdjango-model-utils。我将使用这种向前移动,因为它在save()期间使更复杂的操作更容易。