Django删除了很多关系

时间:2015-06-08 10:40:12

标签: python django m2m

我有以下型号:

class Branch(models.Model):
    releases = models.ManyToManyField(Release)


class Release(models.Model):
    #fields

删除发布对象时的默认django行为是什么(在我的情况下?)是否会删除仅与该发行版相关的所有分支对象?我猜测如果没有它设置它null = True然后如果我尝试删除所有版本它将提供一个IntegrityError正确,因为版本将为空为空。如果我将它设置为null = True,那么我猜测如果相关对象被删除,它只会将版本保留为空列表。删除版本并且分支对象在版本中没有相关对象时,是否可以删除所有相关分支?

e.g

r1 = Release()
r1.save()
r2 = Release()
r2.save()
b1 = Branch()
b1.save()
b1.releases.add(r1)
b2 = Branch()
b2.save()
b2.releases.add(r2)
r1.delete() #this should delete b1 because releases is empty

这种行为可能吗?

1 个答案:

答案 0 :(得分:2)

nullManyToMany关系没有影响。

在Django中,M2M关系为represented via an intermediary table,即自动生成。添加null=True/False不会影响此中间表的构建方式,并且父对象始终不会与子项相关。

blank是影响是否允许使用或不使用子级创建父对象的选项,但它不是数据库级别限制,它只是代码级别验证。

我要实现您正在寻找的级联删除的方法是使用post_delete信号。有点像:

from django.db.models.signals import post_delete
from django.dispatch import receiver

class Branch(models.Model):
    releases = models.ManyToManyField(Release)

class Release(models.Model):
    #fields

@receiver(post_delete, sender=Release)
def cascade_delete_branch(sender, instance, **kwargs):
   # code to handle Branch removal