Джанго - Как вытащить книгу из жанровой модели - PullRequest
0 голосов
/ 28 марта 2019

Я изучаю джанго. Я пытаюсь получить каждую книгу в жанре, которая связана с моей жанровой моделью.

вот модель моего жанра.

class Genre(models.Model):
      name = models.CharField(max_length=200)

     def __str__(self):
     return self.name

и вот моя книжная модель.

class Book(models.Model):
```some fields```
      genre = models.ManyToManyField(Genre, help_text="Select a genre for this book")


     def display_genre(self):
         return ', '.join([genre.name for genre in self.genre.all()[:3]])

     display_genre.short_description = 'Genre'



     def __str__(self):
         return self.title

    def get_absolute_url(self):
        return reverse('book-detail', kwargs={'slug': self.slug})

и вот моя попытка вытащить книгу из жанра с ее деталями

def genre(request):
    genres = Genre.objects.all()

    context = {
         'genres': genres
     }
    return render(request, 'catalog/genre_list.html', context)

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Если у вас есть Genre экземпляр genre, то книги, связанные с ним:

genre.book_set.all()  # set related_name in your model if you want this to be genre.books.all()

Так что если у вас есть список жанров, как вы передаете в своем контексте,Вы можете сделать это в своем шаблоне, чтобы отобразить все книги по жанру:

{% for genre in genres %}
   Books for {{ genre }}:
   {% for book in genre.book_set.all %} 
       {{ book.title }} <br>
   {% endfor %}
{% endfor %}

Обратите внимание, что ваше представление выбирает только жанры, поэтому при отображении шаблона Django должен выполнить один запрос к базе данных для каждого жанра.чтобы получить все книги.Если вы хотите избежать этого и иметь только один дополнительный запрос, чтобы получить их все за один раз, измените запрос в своем представлении:

genres = Genre.objects.all().prefetch_related('book')
0 голосов
/ 28 марта 2019

Вы пытаетесь получить все книги из жанра, но жанр не знает, какие книги он включает.

Вы можете запросить все наборы книг, которые имеют определенные жанры, выполнив следующие действия:

Books.objects.filter(genre__name='Science')

Обязательно используйте двойное подчеркивание между именем класса объекта и его атрибутом.

...