0

我有一个名为“项目”的模型。

可以推荐项目。如果是,它们将显示在主页上(Projects.filter(is_featured=True))

每个项目包含几张幻灯片。这些幻灯片可以是特色(Slide.is_featured=True),并包含一个包含实际图像的图像模型。

在我的主页中,我想显示一个幻灯片,其中每张幻灯片都包含项目名称,以及特色幻灯片中包含的图像。

我通过在我的项目模型中添加一个名为“featured_slide()”的方法来做到这一点,但现在我意识到我每次都在访问数据库,我想通过使用“select_related”语句来改进它。

我怎样才能做到这一点?

理想情况下,我希望有一个像“featured_slide”这样的字段来表示特色幻灯片。

我正在考虑按照以下方式做一些事情:

Projects.filter(is_featured=True).annotate(featured_slide='slides__is_featured=True').select_related(slides__image)

我知道它不可能那么简单(slides__is_featured 不是数据库字段),但你明白了。

4

1 回答 1

2

如果您想要仅显示那些Slides本身具有特色以及与特色相关的幻灯片Projects

class Project(...):
    name = models.CharField()
    is_featured = models.BooleanField()

class Slide(...):
    project = models.ForeignKey(Project)
    is_featured = models.BooleanField()
    image = models.ImageField()

查询幻灯片(使用select_related以避免不必要的查询):

slides = Slide.select_related("project").filter(is_featured=True, project__is_featured=True)

和模板:

<ul>
    {% for slide in slides %}
         <li><img src="{{ slide.image.url }} /><span class="caption">{{ slide.project.name }}</caption></li>
    {% endfor %}
</ul>

编辑:

如果要查找反向关系(即获取一个项目的所有幻灯片),默认情况下可以执行以下操作:

project = Project.objects.get(...)
project_slides = project.slide_set.all()

您添加_set到模型名称。related_name您可以通过向关系添加属性来使其更直观:

class Slide(...):
    project = models.ForeignKey(Project, related_name="slideshow_slides")

现在使用:

project = Project.objects.get(...)
project.slideshow_slides.all()
于 2014-02-18T10:56:46.577 回答