Django Запрос к полю ManytoMany - PullRequest
1 голос
/ 17 апреля 2020

Я создаю простой django проект, который занимается хранением названий книг и авторов и хранением списка читаемых файлов (TBR). Таблица TBR связана с таблицей книг, как многие со многими.

Теперь, я запутался в том, как запросить список книг, которые находятся в определенном c TBR.

Код я написал следующее:

class BookManager(models.Manager):
    def is_read(self):
        return self.filter(read='y')

    def is_not_read(self):
        return self.filter(read='n')

class Genre(models.Model):
    name = models.CharField(max_length=200, help_text='Enter a book genre (e.g. Science Fiction)')

    def __str__(self):
        return self.name

class Author(models.Model):
    first_name = models.CharField(max_length=100, help_text="Enter first name of the author",default="Unknown")
    last_name = models.CharField(max_length=100, help_text="Enter last name of the author",default="Unknown")

    def __str__(self):
        return f'{self.first_name} {self.last_name}'

class Book(models.Model):

    YES = 'y'
    NO = 'n'

    DID_READ_CHOICES = [
        (YES,'Yes'),
        (NO,'No'),
    ]

    title = models.CharField(max_length=100)
    author = models.ForeignKey(
        Author,
        on_delete=models.SET_NULL, 
        null=True,
        related_name='author_books'
        )
    genre = models.ManyToManyField(Genre, help_text='Select a genre for this book')
    summary = models.TextField(max_length=1000, help_text='Enter a brief description of the book',blank=True,null=True)
    read = models.CharField(
        max_length=1,
        choices=DID_READ_CHOICES,
        default=NO,
        )

    objects = BookManager()

    class Meta:
        ordering = ['title']

    def __str__(self):
        return self.title

class TBR(models.Model):
    title = models.CharField(max_length=100)
    book = models.ManyToManyField(
        Book,
        related_name='in_tbr',
        )

    class Meta:
        ordering = ['title']

    def __str__(self):
        return self.title

Я новичок в Django, и я ссылаюсь на документацию Django, любая помощь будет признательна.

Спасибо

Редактировать : я попробовал следующее:

>>> to_be_read = TBR.objects.get(title='TBR1')
>>> for book in to_be_read.book:
...     book.title
...

Но получил следующую ошибку:

Traceback (последний последний вызов):
Файл "", строка 1, в
Ошибка типа: объект ManyRelatedManager не повторяется

1 Ответ

0 голосов
/ 17 апреля 2020

Вы должны использовать book.all()

Попробуйте это

>>> to_be_read = TBR.objects.get(title='TBR1')
>>> for book in to_be_read.book.all():
...     book.title
...
...