过滤后更新 Django 的多对多

Posted

技术标签:

【中文标题】过滤后更新 Django 的多对多【英文标题】:Updating Django's ManytoMany after filter 【发布时间】:2015-12-09 06:46:28 【问题描述】:

我正在尝试更新与用户具有多对多关系的某些文章的 created_by 和edited_by 并添加另一个用户。

我遇到了 MyModel.objects.filter(pk=some_value).update(field1='some value')

作为一种使用单个查询进行更新的方法,是否也可以使用单个查询更新多对多?

Article.objects.filter(Q(created_by__in=[deleted_user_id])| Q(edited_by__in=[deleted_user_id])).update(?)

我应该用什么替换“?”和? 假设我需要在过滤器返回的所有文章中添加“replacement_user_id”。

我想我们可以通过查询“通过”模型来做到这一点。

【问题讨论】:

最好的方法是什么?如果我不能使用 .update() 方法。查询集中所有项目的 for 循环,然后是 .add() 是我知道的一种方式。还有什么比这更好的吗? 【参考方案1】:

使用更新方法是不可能的:

您只能使用此设置非关系字段和 ForeignKey 字段 方法。要更新非关系字段,请将新值作为 持续的。要更新 ForeignKey 字段,请将新值设置为新的 您要指向的模型实例。

了解更多here

更新:

您可以添加多个对象,例如:

articles = Article.objects.filter(Q(created_by__in=[deleted_user_id])| Q(edited_by__in=[deleted_user_id]))
created_by_objs = User.objects.filter(...)
edited_by_objs = User.objects.filter(...)

for article in articles:
    #article.created_by.clear() uncomment if needed
    article.created_by.add(*created_by_objs)
    #article.edited_by.clear() uncomment if needed
    article.edited_by.add(*edited_by_objs)

了解更多here

【讨论】:

最好的方法是什么?如果我不能使用 .update() 方法。查询集中所有项目的 for 循环,然后是 .add() 是我知道的一种方式。还有什么比这更好的吗? @mascot6699 你可以像 .add(*[obj1, obj2, obj3]) 那样做。在此处了解更多信息:docs.djangoproject.com/en/1.8/ref/models/relations/…

以上是关于过滤后更新 Django 的多对多的主要内容,如果未能解决你的问题,请参考以下文章

如何过滤和访问 Django QuerySet 中的多对多字段?

如何在 django 中过滤查询集的多对多

如何在引导选项卡块中按 django 模板中的多对多字段过滤对象

Django如何过滤多对多字段中的对象,而不是原始查询集

完全迷失:在 Django Rest 框架中使用序列化器和更新的多对多

Django 管理中的多对多:选择无