相关模型更新模型字段更改

时间:2016-07-06 14:08:40

标签: python django

当更改父模型的某个字段时,触发相关模型更新的最正确方法是什么?我有这套模型:

class ActivityObject(models.Model):
    is_deleted = models.BooleanField(default=False)

class ActivityJob(models.Model):
    activity_object = models.ForeignKey(
        ActivityObject,
        related_name='activity_jobs',
    )
    is_deleted = models.BooleanField(default=False)

因此,如果我在某个实例上设置ActivityObject.is_deleted = True,我想要的是ActivityJob的所有相关实例也将字段is_deleted更改为True。提前谢谢。

2 个答案:

答案 0 :(得分:1)

覆盖save()将起作用:

class ActivityObject(models.Model):
    is_deleted = models.BooleanField(default=False)

    def save(self, *args, **kwargs):
        super(ActivityObject, self).save(args, kwargs)
        if self.is_deleted:
            for job in self.activity_jobs:
                job.is_deleted = True
                job.save()

这里只是猜测,但如果真正的目的是删除相关ActivityJob时删除的ActivityObject,那么您可以继续删除ActivityObject。 Django的默认行为将删除与其连接的所有ActivityJob

如果您想在删除时执行其他操作,请使用Django的pre_deletepost_delete信号,这些信号将调用您在删除指定类型的对象之前/之后定义的函数

编辑:如果您在处理update()和更改ActivityObject的查询集上使用is_deleted,则可以确保在{{1}上执行相应的update() },或者您可以覆盖ActivityJob ActivityObject这样的this功能,以使其自动生成。

答案 1 :(得分:0)

您可以使用Django信号' pre_deletepost_delete。 Django Signals documentation中提供了更多详细信息和示例。