简体   繁体   English

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

[英]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_deletepost_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() ,也可以像这样覆盖ActivityObjectqueryset功能以使其自动发生。

You can use Django signals' pre_delete or post_delete . 您可以使用Django信号的pre_deletepost_delete More details and examples are available in the Django Signals documentation . Django Signals 文档中提供了更多详细信息和示例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM