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 查询更新反向多对多字段的主要内容,如果未能解决你的问题,请参考以下文章