如何从 Django 中基于类的视图发送多个模型

How to send multiple model from a classbased view in django

我制作了一个书单,可以在书单中上传封面图片 class。为了获得更多图片,我添加了另一个 class,名为 Bookcover。现在 Views.py 如何使用 BookListView

发送 Booklist 和 Bookcover's

models.py 文件如下

from django.db import models
from django.utils import timezone



class Booklist(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length = 100)
    cover = models.ImageField(null=True, blank=True, default='default-book.jpg')
    description = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    price = models.DecimalField(decimal_places=3, max_digits=100)

    def __str__(self):
    return self.title


class Bookcover(models.Model):
    post = models.ForeignKey(Booklist, default=None, on_delete=models.CASCADE)
    covers = models.ImageField(upload_to = 'images/')

    def __str__(self):
        return self.post.title

这里是 views.py 文件

from django.shortcuts import render
from django.views.generic import ListView
from .models import Booklist, Bookcover




def home(request):
    return render(request, template_name='home/index.html')

class BookListView(ListView):
    model = Booklist
    template_name = 'home/index.html'
    context_object_name = 'books'
    ordering = ['-date_posted'] 

如果您创建 ForeignKey,Django 会自动生成反向关系以访问 - 在本例中 - 特定 Book 的相关 BookCover。由于您没有指定 related_name=… parameter [Django-doc],这个关系的名称是 <i>modelname</i>_set,所以在这种情况下,bookcover_set.

在模板中,您可以访问一本书的封面:

{% for book in books %}
    {{ book.title }}
    {% for cover in book<b>.bookcover_set.all</b> %}
        <img src="{{ cover.covers.url }}">
    {% endfor %}
{% endfor %}

然而,这将导致 N+1 问题。您可以通过使用 .prefetch_related(…) [Django-doc]:

来避免这种情况
class BookListView(ListView):
    <b>queryset</b> = Booklist.objects<b>.prefetch_related('bookcover_set')</b>
    template_name = 'home/index.html'
    context_object_name = 'books'
    ordering = ['-date_posted']