我在模型中有两个字段:
is_active = models.BooleanField(default=False)
active_from = models.DateTimeField(blank=True)
当is_active
设置为True
时,我希望将active_from
更新为当前日期时间。
我该怎么做呢?如果有一个更简洁的方法可以在一个领域做到这一点,我愿意接受替代方案。
谢谢!
编辑:我想在模型中包含这个以保持封装的东西。这将是API的一部分。
答案 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)
另一种选择是来自FieldTracker的django-model-utils。我将使用这种向前移动,因为它在save()
期间使更复杂的操作更容易。