在对象遍历后批量清除ManyToMany

时间:2017-07-23 14:49:38

标签: python django database bulkupdate

我有以下数据模型:

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?有关,但在那个问题中,在删除关系之前没有模型遍历。

1 个答案:

答案 0 :(得分:2)

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

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

这将在一个查询中运行。