我正在学习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)
答案 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')
请确保在对象类名称和它具有的属性之间使用双下划线。