【问题标题】:Django delete all M2M related objects on main object deleteDjango 删除主对象删除上的所有 M2M 相关对象
【发布时间】: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

我如何在删除时以安全的方式实现它,无论是有信号还是无信号?

【问题讨论】:

  • 这可能会有所帮助。 stackoverflow.com/questions/38388423/…
  • Project_Results 没有指向 Project 的 ForeignKey 是否有原因?
  • 问题与M2M有关,如果是foriengkey,则models.cascade默认会这样做
  • 一个Project_Results可以链接到多个Projects吗?如果是这样,您是否仍要在其Projects 的任何 个被删除时删除它,还是仅当其Projects 的所有Projects 被删除时删除它?如果没有,那么您几乎可以肯定使用 ForeignKey 而不是 M2M。

标签: django django-models django-rest-framework django-forms django-templates


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2012-11-04
    • 2020-10-27
    • 2018-12-27
    • 1970-01-01
    相关资源
    最近更新 更多