python - 由 Django 中的字段更改触发的操作

标签 python django django-models

当我的一个模型中的字段发生更改时,我如何进行操作?在这种特殊情况下,我有这个模型:

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/

相关文章:

作为 float 的字符串的 Python int()

python - 无法从 Django sqlite3 数据库中删除项目,错误为 "foreign key constraint failed"

python - 如何使用 ForeignKey ('self' ) 获取字段而不可能链接到同一条目?

python - 使用 python 的二维 FFT 导致频率稍微偏移

python - GeoDjango GEOSException 错误

python - 添加多个重叠立方体的矢量化方式

django - NoReverseMatch at/polls/Reverse for 'vote' with argument '(' ', )' not found. 1 pattern(s) tried: [' polls/(?P<question_id>[0-9]+)/vote/$']

python - django 1.8.3 python manage.py 迁移 Linux

django - 如何实现不调用count(*)的分页器

Django ORM __in 但不是精确的,而是包含不区分大小写的?