当前位置: 首页 > 面试题库 >

如何在Django中更新manytomany字段?

澹台俊晖
2023-03-14
问题内容

这是一个例子:

如果我有这些课程

class Author(models.Model):
    name = models.CharField(max_length=45)

class Book(models.Model):
    name = models.CharField(max_length=45)
    authors = models.ManyToManyField(Author)

在数据库中,我有一位作者名为“ George”,另一位作者名为“ Georfe”。最后一个是错误。因此,我想要的是每本以“
Georfe”为作者之一的书都被作者“ George”代替。

在SQL中确实很容易做到。如果id为“ George” = 3,id为“ Georfe” = 7,并且关系表名称为“ author_book”:

UPDATE author_book SET id=3 WHERE id=7;

可以使用Django ORM做到这一点吗?

我找到了一种方法:遍历所有打字错误的作者的相关书籍,然后执行以下操作:

book.authors.add(Author.objects.get(id=3))
book.authors.remove(Author.objects.get(id=7))

但是我发现这种解决方案并不是真正的优雅和高效。有没有循环的解决方案吗?


问题答案:

注意: 此代码将 删除 不良的“
georfe”作者,并更新书籍以指向正确的作者。如果您不想这样做,请使用.remove()@jcdyer的答案提及。

你可以做这样的事情吗?

george_author = Author.objects.get(name="George")
for book in Book.objects.filter(authors__name="Georfe"):
    book.authors.add(george_author.id)
    book.authors.filter(name="Georfe").delete()

我怀疑如果您有一个将两个模型连接在一起的显式表(使用“ through”关键字arg)会更容易-
在这种情况下,您将可以直接访问关系表,并且可以.update(id=george_author.id)对其进行操作。



 类似资料:
  • 我在数据表和通过data_user表链接的用户表之间有一个Hibernate ManyToMany映射。现在我想更新数据表,以便在数据中再添加一个用户。如何更新链接表(data_user)为新用户添加一个条目? NonUniqueObjectException:一个具有相同标识符值的不同对象已经与会话相关联。 PS:我对冬眠很陌生。

  • 问题内容: 我下面有两个… 我想更新的,有时也用下面的方法有时… 方法#1 方法#2 第一种方法可以正常工作,但第二种则不能。但是,当我将“ 从” 移至“ 第二”方法时,效果很好,而不是第一个。 问题答案: 问题是一个问题。 假设它是的子类,那么您的问题是关系中只有一方是拥有实体。将使得实体所属的实体,因此仅改变该实体被持久化。这意味着,你必须更新在这两种情况下的实体。如果您有一个“ a”的组列表

  • 问题内容: 我有一个模型: 我需要按照以下原则构造一个过滤器: 它必须是User的过滤器,并且必须是单个过滤器参数。这样做的原因是,我正在构造URL查询字符串以过滤管理员用户变更列表:http://myserver/admin/auth/user/?zones=3 看起来应该很简单,但我的大脑却不配合! 问题答案: 只是重申托马斯所说的话。 在多对多和多对一测试中,有很多样式过滤器的示例。这是你特

  • 问题内容: 我有一个与另一个对象具有多对多关系的对象。 在Django Admin中,这会在多重选择框中产生很长的列表。 我想过滤掉ManyToMany关系,所以我只获取客户选择的城市中可用的类别。 这可能吗?我需要为其创建一个小部件吗?如果是这样,我该如何将行为从标准ManyToMany字段复制到该字段,因为我也希望filter_horizo​​ntal函数。 这些是我的简化模型: 问题答案:

  • 问题内容: 我正在尝试像SQL中的别名一样更改DRF序列化器中的“模型”字段名称。我尝试了不同的方法,但无法成功。 models.py serializers.py 我也曾尝试在Django Queryset中添加别名,但无法更改。 更新 这是我面临的例外 / ViewName /’模块’对象上的AttributeError没有属性’Field’ 我怎样才能做到这一点? 问题答案: 序列化程序字段

  • 问题内容: ElasticSearch文档尚不清楚如何执行此操作。 我索引了一些推文,其中一个字段created_at被索引为字符串而不是日期。我找不到如何通过curl调用对该更改重新索引。如果重新编制索引是一个复杂的过程,那么我宁愿只是删除其中的内容并重新开始。但是,我也找不到如何指定字段类型! 任何帮助是极大的赞赏。 问题答案: 您需要使用Put Mapping AP I 定义映射。 日期可以