[英]Related models update on model field change
What is the most proper way to trigger update of related models, when one of the fields of parent model is changed? 当父模型的字段之一发生更改时,触发相关模型更新的最合适方法是什么? I have this set of models:
我有这套模型:
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)
so if I set ActivityObject.is_deleted = True
on some instance all I want is that all related instances of ActivityJob
also changed field is_deleted
to True
. 因此,如果我在某些实例上设置
ActivityObject.is_deleted = True
,那么我想要的是所有与ActivityJob
相关的实例也将字段is_deleted
更改为True
。 Thanks in advance. 提前致谢。
Overriding save() will work: 覆盖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()
Just guessing here, but if the real purpose of this is to delete ActivityJob
s when related ActivityObject
s are deleted, then you can just go ahead and delete the ActivityObject
. 只是在这里猜测,但是如果这样做的真正目的是在删除相关的
ActivityObject
时删除ActivityJob
,那么您可以继续并删除ActivityObject
。 Django's default behavior will remove all the ActivityJob
s connected to it. Django的默认行为将删除与其连接的所有
ActivityJob
。
If you want to perform some other action when deleting, use Django's pre_delete or post_delete signals, which will call a function you define before/after deleting objects of the type you specify. 如果要在删除时执行其他操作,请使用Django的pre_delete或post_delete信号,这将在删除指定类型的对象之前/之后调用您定义的函数。
EDIT: if you ever use update()
on querysets dealing with ActivityObject
and changing is_deleted
, you can either ensure that you perform a corresponding update()
on ActivityJob
, or you can override ActivityObject
's queryset
functionality like this to make it happen automatically. 编辑:如果您曾经在处理
ActivityObject
上使用update()
并更改is_deleted
,则可以确保在ActivityJob
上执行相应的update()
,也可以像这样覆盖ActivityObject
的queryset
功能以使其自动发生。
You can use Django signals' pre_delete
or post_delete
. 您可以使用Django信号的
pre_delete
或post_delete
。 More details and examples are available in the Django Signals documentation . Django Signals 文档中提供了更多详细信息和示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.