Django ORM запрос для обновления обратного поля многие ко многим

Модели выглядят следующим образом:

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. There is a list like:
[
{Book_id1:[Author_id1, Author_id2]},
{Book_id2:[Author_id2, Author_id3]},
]

Эту информацию необходимо обновить в БД. Как это можно сделать эффективным способом, используя ORM?

(В настоящее время в БД может быть Book_id1 связан с [Author_id1,Author_id3] поэтому обновление должно быть в состоянии добавить author_id2 и удалить author_id3)

Вы можете сделать два запроса к модели "многие ко многим":

data = [
    {book_id1:[author_id1, author_id2]},
    {book_id2:[author_id2, author_id3]},
]
book_ids = [book_id 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
])
Вернуться на верх