Невозможно получить атрибут отношения в Django, отношения "многие-ко-многим

models.py:

class Author(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ManyToManyField(Author)
   
    def __str__(self):
        return self.title

Я могу фильтровать books по отношению author:

>>> Book.objects.filter(author__name__contains="Fyodor")
<QuerySet [<Book: Crime and Punishment>, <Book: The Brothers Karamazov>]>

Однако я не могу получить автора книги :

>>> all_books = Book.objects.all()
>>> all_books[0].author
<django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager object at 0x7fdf068a2b20>
>>> all_books[0].author.name

Есть предложения?

У вас есть отношение ManyToMany между книгами и авторами, поэтому у каждой книги будет много авторов. Следовательно, book.author дает вам кверисет авторов.

Так что вам нужно сделать что-то вроде этого:

# get a single book:
book = Book.objects.get(id=<the-book-id>)

# get all the authors of a book:
authors = book.author.all()

# get the first author of the book:
first_author = authors.first()
name = first_author.name
Вернуться на верх