Django - 如何从流派模型中取出一本书

Django - How to pull out a book from genre model

我正在学习 Django。我正在尝试获取与我的类型模型相关的每个类型的每一本书。

这是我的流派模型。

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)

您正在尝试获取某个流派的所有书籍,但该流派不知道它包含哪些书籍。

您可以通过执行以下操作查询具有特定类型的所有图书集:

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

请务必在您的对象 class 名称和它具有的属性之间使用双下划线。

如果您有一个 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')