对象遍历后批量清除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()
这将 运行 一次查询。
我有以下数据模型:
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()
这将 运行 一次查询。