【问题标题】:Django ORM query to update reverse many to many fieldDjango ORM 查询更新反向多对多字段
【发布时间】: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)

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

现在,

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

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

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

【问题讨论】:

    标签: python django django-models django-views orm


    【解决方案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...谢谢!已更新。
    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2016-08-17
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多