【问题标题】:Django bulk update for many to many relationshipDjango批量更新多对多关系
【发布时间】:2017-11-27 17:29:36
【问题描述】:

我有一个多对多关系的 Event 和 EventCategory 模型。

有 2 个事件类别 - 过去(ID 为 2)和未来(ID 为 1)。

我想通过

找到未来的所有事件
models = Event.objects.filter(categories__slug='future')

然后更新它们,使它们都成为过去。

我是否应该创建一个 Event 实例列表,然后从相关表中删除,并插入具有新类别 ID 的实例 - 如果可能的话,只需要一些指导,了解最有效的方法。

非常感谢

【问题讨论】:

  • 你可以使用update(**kwargs),你可以在这里阅读docs.djangoproject.com/en/1.11/ref/models/querysets/#update
  • 非常感谢您回来。是的,我在我的代码中使用了 update(**kwargs),但我想更新相关表,而不是主表,文档说你不能这样做“update() 方法会立即应用,并且QuerySet 更新的唯一限制是它只能更新模型主表中的列,不能更新相关模型”
  • 但是你可以重新考虑你当前的查询,你可以以另一种方式进入你的目标表,例如文档说:Entry.objects.update(blog__name='foo') # Won't work! 但这将Entry.objects.filter(blog__id=1).update(comments_on=True)
  • 非常感谢您的评论 - 抱歉耽搁了 - 我有时间会看看。
  • 您好,感谢您的回复。仍然不确定这将如何让我更新相关表......这显然不起作用 Event.objects.filter(categories__id=1).update(categories__id=2) .. 我如何(有效地)更新 eventcategory_id从这个相关的表?对不起!我在下面发布了我自己的解决方案,但我确信它可以改进。

标签: django


【解决方案1】:

我不确定这是否是满足我需求的最有效解决方案,但它确实有效:

找到我想与事件关联的新类别(这是“过去”类别)

cat = EventCategory.objects.get(pk=2)

这是我现有的关系,其中 1 是未来类别的 ID

models = Event.objects.filter(categories__id=1)

for model in models:
    model.categories.clear()
    model.categories.add(cat)

现在相关表中的所有元素都在过去的类别中。

【讨论】:

  • 那你的解决方案是什么
猜你喜欢
  • 2013-06-17
  • 2016-03-20
  • 2012-12-01
  • 2020-08-15
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
相关资源
最近更新 更多