Django 删除主对象删除上的所有 M2M 相关对象
Posted
技术标签:
【中文标题】Django 删除主对象删除上的所有 M2M 相关对象【英文标题】:Django delete all M2M related objects on main object delete 【发布时间】:2020-05-03 22:30:29 【问题描述】:class Project(models.Model):
name = models.CharField(max_length=100)
project_results_m2m = models.ManyToManyField(Project_Results,blank=True)
def delete_all(self):
pass ### TO BE ADDED FROM ANSWERS
信号
@receiver(post_delete,sender=Project)
def delete_project_signal(sender,instance,created=False,**kwargs):
if created is False:
instance.delete_all()
p = Project.objects.get(id=1)
p.delete()
一旦在项目对象1
上触发delete()
以上,则信号将执行delete_all
函数。
现在我想删除所有与project_results_m2m
相关的Project_Results
对象,用于项目对象1
。
我如何在删除时以安全的方式实现它,无论是有信号还是无信号?
【问题讨论】:
这可能会有所帮助。 ***.com/questions/38388423/… Project_Results 没有指向 Project 的 ForeignKey 是否有原因? 问题与M2M有关,如果是foriengkey,则models.cascade
默认会这样做
一个Project_Results
可以链接到多个Project
s吗?如果是这样,您是否仍要在其Project
s 的任何 个被删除时删除它,还是仅当其Project
s 的所有 个Project
s 被删除时删除它?如果没有,那么您几乎可以肯定使用 ForeignKey 而不是 M2M。
【参考方案1】:
可能你需要使用pre_delete
信号:
from django.db.models.signals import pre_delete
@receiver(pre_delete, sender=Project, dispatch_uid='project_delete_all')
def delete_all_instances(sender, instance, using, **kwargs):
instance.project_results_m2m.all().delete()
【讨论】:
以上是关于Django 删除主对象删除上的所有 M2M 相关对象的主要内容,如果未能解决你的问题,请参考以下文章
Django 迁移错误:您无法更改 M2M 字段或从 M2M 字段更改,或通过 = 在 M2M 字段上添加或删除