我有以下型号:
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
这种行为可能吗?
答案 0 :(得分:2)
null
对ManyToMany
关系没有影响。
在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