Модель 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:

enter image description here

Затем я создал новый Book и назначил Льва Толстого в качестве Author:

enter image description here

В оболочке 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 книга также не назначена:

enter image description here

Я хотел бы получить доступ к 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() 

Надеюсь, вы поняли то, что я попытался объяснить. Если возникнет какая-либо ошибка, дайте мне знать, указав точную ошибку в поле для комментариев. Спасибо.

Вернуться на верх