Django - ManyToManyRelation中的级联删除

And*_*Dog 18 django many-to-many cascading-deletes

使用以下相关模型(一个博​​客条目可以有多个修订版):

class BlogEntryRevision(models.Model):
    revisionNumber = models.IntegerField()
    title = models.CharField(max_length = 120)
    text = models.TextField()
    [...]

class BlogEntry(models.Model):
    revisions = models.ManyToManyField(BlogEntryRevision)
    [...]
Run Code Online (Sandbox Code Playgroud)

如何在删除BlogEntryRevision相应的内容时告诉Django删除所有相关的s BlogEntry?如果删除了"其他"端的对象,则默认似乎是将对象保持为多对多关系.有什么方法可以做到这一点 - 最好不要超越BlogEntry.delete

Dan*_*man 14

我认为你误解了ManyToMany关系的本质.你谈到被删除的"相应的BlogEntry".但是,ManyToMany的重点在于每个BlogEntryRevision都有多个与之相关的BlogEntries.(当然,每个BlogEntry都有多个BlogEntryRevisions,但你已经知道了.)

从您使用的名称,以及您想要删除级联功能的事实来看,我认为使用BlogEntryRevision到BlogEntry的标准ForeignKey会更好.只要您没有设置null=True该ForeignKey,删除就会被删除 - 当BlogEntry被删除时,所有修订也将被删除.

  • 是的,我在评论中承认了另一个答案的错误.为了完整起见:假设使用"ManyToManyRelation"更有意义的用例,那么级联删除的好方法是什么?Gabi Purcaru删除答案的方法是否有效? (2认同)
  • 删除将在``null = True``上级联 (2认同)

jes*_*eng 13

我今天有这个确切的用例:

  • 模特作者:可以有几个条目
  • 模特入门:可以有几位作者

为此,我使用的是ManyToManyRelationship.

我的用例是:如果我删除特定作者的最后一个条目,那么也应该删除该作者.

可以使用以下pre_delete信号实现解决方案:

@receiver(pre_delete, sender=Entry)
def pre_delete_story(sender, instance, **kwargs):
    for author in instance.authors.all():
        if author.entries.count() == 1 and instance in author.entries.all():
            # instance is the only Entry authored by this Author, so delete it
            author.delete()
Run Code Online (Sandbox Code Playgroud)