代码之家  ›  专栏  ›  技术社区  ›  AndiDog

ManyToManyRelation中的Django-级联删除

  •  15
  • AndiDog  · 技术社区  · 16 年前

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

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

    我怎么能告诉Django删除所有相关的 BlogEntryRevision 当对应的 BlogEntry 是否已删除?默认情况似乎是,如果“另一方”的对象被删除,则将对象保持多对多关系。任何方法-最好不覆盖 BlogEntry.delete ?

    4 回复  |  直到 16 年前
        1
  •  18
  •   ICW    7 年前

    我认为你误解了人与人之间关系的本质。你说“相应的博客条目”被删除了。但是很多人的观点是每一个BlogEntryRevision都有 倍数 与之相关的博客条目。(当然,每个BlogEntry都有多个BlogEntryRevisions,但您已经知道了。)

    null=True 在这个ForeignKey上,删除将级联-当BlogEntry被删除时,所有的修改也将被删除。

    从Django 2.0开始

    ForeignKey 初始化器现在要求您指定 on_delete 参数:

    from django.db import models
    from .models import MyRelatedModel
    
    
    class model(models.Model):
        related_model = models.ForeignKey(MyRelatedModel, on_delete=models.CASCADE)
    
        2
  •  14
  •   aoeu jessepeng    9 年前

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

    • 模型条目:可以有多个作者

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

    pre_delete signal :

    @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()
    
        3
  •  2
  •   Daniel DiPaolo    16 年前

    你可以用 custom model manager ,但文档似乎表明 does do something like this already 我想不起来这到底是什么意思:

    命名为delete()。这种方法 立即删除对象并具有 没有返回值。例子:

    e.delete()
    

    也可以删除对象 散装的。每个QuerySet都有一个delete() 方法,它删除 那个问题。

    例如,这将删除所有条目

    Entry.objects.filter(pub_date__year=2005).delete()
    

    记住无论何时 所以的delete()方法 必须在 过程。如果你提供了 想确保它被调用,你 该模型的实例(例如 遍历QuerySet并调用 而不是使用批量删除() 查询集的方法。

    当Django删除一个对象时 删除级联的约束--在 “被删除”将与 例如:

    b = Blog.objects.get(pk=1)
    # This will delete the Blog and all of its Entry objects.
    b.delete()
    
        4
  •  2
  •   jackotonye Dmit3Y    8 年前

    只需使用 clear() 方法移除相关对象,因为Django使用through模型指定关系clear方法移除所有相关的 BlogEntryRevision

    be = BlogEntry.objects.get(id=1)
    be.blogentryrevision_set.clear()