Django ORM 查询更新反向多对多字段

Posted

技术标签:

【中文标题】Django ORM 查询更新反向多对多字段【英文标题】:Django ORM query to update reverse many to many field 【发布时间】:2022-01-23 02:16:40 【问题描述】:

模型看起来像:

class Book(models.Model):
    name = models.TextField(verbose_name='Book Name')

class Author(models.Model):
    name = models.TextField(verbose_name='Author Name')
    Books = models.ManyToManyField(Book)

图书可以有很多作者 作者可以写很多书

现在,

    有一个类似的列表:
[
Book_id1:[Author_id1, Author_id2],
Book_id2:[Author_id2, Author_id3],
]

需要在数据库中更新此信息。 如何使用 ORM 以有效的方式做到这一点?

(目前数据库可能有 Book_id1 与 [Author_id1,Author_id3] 相关联 所以更新应该能够添加author_id2和删除author_id3)

【问题讨论】:

【参考方案1】:

您可以对多对多模型进行两个查询:

data = [
    book_id1:[author_id1, author_id2],
    book_id2:[author_id2, author_id3],
]
book_ids = [book_id for datum in data for book_id in datum]

BookAuthor = Author.books.through
BookAuthor.objects.filter(book_id__in=book_ids).delete()
BookAuthor.objects.bulk_create([
    BookAuthor(book_id=bi, author_id=ai)
    for datum in data
    for bi, ais in datum.items()
    for ai in ais
])

【讨论】:

您好,非常感谢!轻微更新(对于列表中的缺失): book_ids = [book_id for datum in data for book_id in datum] @akashdeep: aarrrgghhhh...谢谢!已更新。

以上是关于Django ORM 查询更新反向多对多字段的主要内容,如果未能解决你的问题,请参考以下文章

Django ORM:构造查询,该查询将在多对多字段的最后位置的对象中的字段上查找匹配项

Django聚合查询 orm字段及属性

Django 补充ORM多对多正向查询

具有反向多对多字段的 ModelForm

Django——model基础

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