对象遍历后批量清除ManyToMany

Bulk clear ManyToMany after object traversal

我有以下数据模型:

class ArticleSet(Model):
    pass

class Article(Model):
    article_set = ForeignKey(ArticleSet, related_name = 'articles')
    attachments = ManyToManyField(Attachment, related_name='articles')

现在我有一个 ArticleSet 并想清除(而不是删除!)其中的所有附件。以下将起作用:

for article in article_set.articles.all():
    article.attachments.clear()

但是,这将导致 article_set 中的每篇文章都需要进行一次数据库查询。有没有办法在对数据库的一次调用中做同样的事情?我正在使用 Django 1.11。

p.s。这个问题和How do I remove multiple objects in a ManyToMany relationship based on a filter?有关,但是那个问题在删除关系之前没有模型遍历。

您可以使用 through 属性访问 ManyToMany table。通过从 table 中删除项目,您将删除关系。所以尝试:

m2m_model = Article.attachments.through
m2m_model.objects.filter(article__article_set=article_set).delete()

这将 运行 一次查询。