Модель 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()
Надеюсь, вы поняли то, что я попытался объяснить. Если возникнет какая-либо ошибка, дайте мне знать, указав точную ошибку в поле для комментариев. Спасибо.


