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