当更改父模型的某个字段时,触发相关模型更新的最正确方法是什么?我有这套模型:
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
。提前谢谢。
答案 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_delete或post_delete信号,这些信号将调用您在删除指定类型的对象之前/之后定义的函数
编辑:如果您在处理update()
和更改ActivityObject
的查询集上使用is_deleted
,则可以确保在{{1}上执行相应的update()
},或者您可以覆盖ActivityJob
ActivityObject
这样的this功能,以使其自动生成。
答案 1 :(得分:0)
您可以使用Django信号' pre_delete
或post_delete
。 Django Signals documentation中提供了更多详细信息和示例。