当模型通过多对多关系引用的对象被删除时更新模型

Updating a model when an object it references through a ManyToMany relation is deleted

我有一个模型,例如

class ModelA(models.Model):
  name = models.CharField()

class ModelB(models.Model):
  last_modified_time = models.DateTimeField()
  as = models.ManyToManyField('ModelA')

当我删除 ModelA 的一个实例时,我还想更新所有引用 ModelA 的 ModelB 实例上的 last_modified_time 字段。我可以为此使用预删除信号,即

def pre_delete_handler(sender=None, instance=None, *args, **kwargs):
   # update all using instance.modelbs...

models.signals.pre_delete.connect(pre_delete_handler, sender=ModelA)

但是每次新模型通过 ManyToMany 引用它时,都需要更新这段代码,从维护的角度来看,这不是最好的。我正在寻找一种方法来枚举 ModelA 引用的所有模型,这样我就可以进行一次涵盖所有情况的更新,但无法找到执行此操作的最佳方法。枚举与 ModelA 相关的所有对象的正确方法是什么?

如果所有引用 A 的多对多模型都有字段 last_modified_time,那么这样的事情就可以工作:

from django.db.models.fields.reverse_related import ManyToManyRel
from django.utils import timezone


def pre_delete_handler(sender=None, instance=None, *args, **kwargs):
    if not instance:
        return

    # Get all reverse m2m fields
    reverse_m2m_fields = [m for m in instance._meta.model._meta.get_fields() if isinstance(m, ManyToManyRel)]
    # or [m for m in ModelA._meta.get_fields() if isinstance(m, ManyToManyRel)]

    for f in reverse_m2m_fields:
        # Find the name of the reverse m2m field from this model
        field_name = f.related_name or f.related_query_name or f'{f.name}_set'
        getattr(instance, field_name).update(last_modified_time=timezone.now())


models.signals.pre_delete.connect(pre_delete_handler, sender=ModelA)