当我的一个模型中的字段发生更改时,我如何进行操作?在这种特殊情况下,我有这个模型:
class Game(models.Model):
STATE_CHOICES = (
('S', 'Setup'),
('A', 'Active'),
('P', 'Paused'),
('F', 'Finished')
)
name = models.CharField(max_length=100)
owner = models.ForeignKey(User)
created = models.DateTimeField(auto_now_add=True)
started = models.DateTimeField(null=True)
state = models.CharField(max_length=1, choices=STATE_CHOICES, default='S')
当状态从设置变为事件时,我希望创建单位,并在“开始”字段中填充当前日期时间(除其他外)。
我怀疑需要一个模型实例方法,但文档似乎没有太多关于以这种方式使用它们的说法。
更新:我已将以下内容添加到我的游戏类中:
def __init__(self, *args, **kwargs):
super(Game, self).__init__(*args, **kwargs)
self.old_state = self.state
def save(self, force_insert=False, force_update=False):
if self.old_state == 'S' and self.state == 'A':
self.started = datetime.datetime.now()
super(Game, self).save(force_insert, force_update)
self.old_state = self.state
最佳答案
已回答,但这里有一个使用信号、post_init 和 post_save 的示例。
from django.db.models.signals import post_save, post_init
class MyModel(models.Model):
state = models.IntegerField()
previous_state = None
@staticmethod
def post_save(sender, instance, created, **kwargs):
if instance.previous_state != instance.state or created:
do_something_with_state_change()
@staticmethod
def remember_state(sender, instance, **kwargs):
instance.previous_state = instance.state
post_save.connect(MyModel.post_save, sender=MyModel)
post_init.connect(MyModel.remember_state, sender=MyModel)
关于python - 由 Django 中的字段更改触发的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1197674/