过滤后更新 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 模板中的多对多字段过滤对象