Модель Django ManyToMany: невозможно получить доступ к одному отношению из другого
Мой models.py
:
class Author(models.Model):
name = models.CharField(max_length=100)
books = models.ManyToManyField(
"Book", related_name="books", blank=True
)
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ManyToManyField(Author)
В Django admin
я сначала создал экземпляр Author
, не назначая ему никаких Book
:
Затем я создал новый Book
и назначил Льва Толстого в качестве Author
:
В оболочке Django я могу получить доступ к Book
'Author
:
>>> Book.objects.filter(title="War and Peace").first().author.first()
<Author: Leo Tolstoy>
Но я не могу получить доступ к Author
'Books
:
>>> Author.objects.filter(name="Leo Tolstoy").first().books.all()
<QuerySet []>
В представлении Admin
книга также не назначена:
Я хотел бы получить доступ к Author
'Books
, а также к Books
показать в представлении Author
Admin
.
Вам нужен только один ManyToManyField
. Вы также должны передать "books"
в качестве related_name
на Book.authors
, так как это имя Django будет использовать для атрибута менеджера "многие ко многим", который он автоматически добавляет к Author
экземплярам.
Смотрите пример в Django docs для получения дополнительной информации.
Когда ManyToManyField
создается с обеих сторон отношения, Django под капотом создает две ассоциативные таблицы между таблицами book и author. Изменения в одной таблице не влияют на другую.
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(
Author, related_name="books", blank=True
)
Я предлагаю вам сделать следующее:
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ManyToManyField(Author, related_name="books",blank=True)
Вам нужен один ManyToManyField
, тогда django создаст две ассоциативные таблицы между таблицами book
и author
. Изменения в одной таблице не повлияют на другую. Вы можете посмотреть в документации django об отношениях many to many relations. Я удалил ваше поле books
в своем ответе, потому что вы создали экземпляр вашей Author
, но не назначили ему "книгу", и вы создали экземпляр Book
с предоставлением title
и author
в вашей Book
модели. Таким образом, все ваши данные не будут удалены. Я также добавил related_name
к вашему полю author
в вашей модели Book
, потому что когда вы пытаетесь получить книги , связанные с автором (например, "Лое Толстой"), вы можете получить следующее:
Author.objects.get(name="Leo Tolstoy").books.all()
Надеюсь, вы поняли то, что я попытался объяснить. Если возникнет какая-либо ошибка, дайте мне знать, указав точную ошибку в поле для комментариев. Спасибо.