Django-如何从体裁模型中提取书籍

时间:2019-03-28 15:11:04

标签: django django-views django-filter

我正在学习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)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您正在尝试从一种类型中获取所有书籍,但是该类型不知道它包括哪些书籍。

您可以通过执行以下操作来查询所有具有特定体裁的书籍集:

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

请确保在对象类名称和它具有的属性之间使用双下划线。