Как обновить manytomany поле в Django?

Когда у вас есть модуль пространства имен, используйте следующее отображение:

...mapActions("panels", ["GET_PANEL"])

Где первый аргумент - это пространство имен модуля, а второй - массив действий для отображения.

16
задан Etienne 24 February 2012 в 18:09
поделиться

2 ответа

Примечание: Этот код удалит плохого автора '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) с ней.

20
ответ дан 30 November 2019 в 16:19
поделиться

С помощью автоматически созданной сквозной таблицы вы можете выполнить двухэтапную вставку и удаление, что удобно для чтения.

george = Author.objects.get(name='George')
georfe = Author.objects.get(name='Georfe')

book.authors.add(george)
book.authors.remove(georfe)
assert george in book.authors

Если у вас есть явно определенная сквозная таблица (авторы = модели .ManyToManyField (Author, through = BookAuthors), то вы можете явно изменить отношения в BookAuthor. Малоизвестный факт заключается в том, что эта модель уже существует, она генерируется django автоматически. Обычно вы должны создавать явную сквозную модель только в том случае, если у вас есть дополнительные данные, которые вы хотите сохранить (например, главы, написанные конкретным автором в книге с несколькими авторами).

# This line is only needed without a custom through model.
BookAuthor = Book.authors.through
book_author = BookAuthor.objects.get(author=georfe, book=great_american_novel)
book_author.author = george
book_author.save()
assert george in book.authors
17
ответ дан 30 November 2019 в 16:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: