【发布时间】:2019-01-20 14:22:11
【问题描述】:
我有这个模型(简化版):
class Photo(models.Model):
image = models.ImageField(null=True, blank=True, upload_to='photos')
photographer = models.CharField(max_length=255)
class Genre(models.Model):
title = models.CharField(max_length=255)
class Decade(models.Model):
title = models.CharField(max_length=255)
class Album(models.Model):
title = models.CharField(max_length=255)
genre = models.ForeignKey(Genre, on_delete=models.CASCADE)
decade = models.ForeignKey(Decade, on_delete=models.CASCADE)
photo = models.ForeignKey(Photo, on_delete=models.CASCADE, null=True, blank=True)
如您所见,一些相册有照片。我想做的是显示一个包含所有流派的列表,其中将显示特定十年中该流派的专辑数量,以及该流派的照片。照片应该是该类型相册中的照片。我无法获取第一条记录的照片,因为它可能没有照片,所以它应该获取有照片的专辑的照片。
例子:
类型:
1 | Rock
2 | Punk
3 | Jazz
专辑:
1 | Rock All | genre = rock | decade = sixties
2 | Rock It Up | genre = rock | decade = sixties
3 | Jazz Basiq | genre = jazz | decade = nineties
4 | Jazz Uno | genre = jazz | decade = sixties
5 | Punkio | genre = punk | decade = sixties
照片:
1 | rockitup.jpg | Belongs to Album 2
2 | uno.jpg | Belongs to Album 4
3 | punkio.jpg | Belongs to Album 5
4 | punkio2.jpg | Belongs to Album 5
5 | punkio3.jpg | Belongs to Album 5
6 | basiq.jpg | Belongs to Album 3
所以,我最终希望在模板中显示的内容类似于:
In the sixties this was happening:
{% for genre in genres %}
<li>Genre: {{ genre.title }} has {{ genre.total }} albums and here is an image:
<img src="{{ genre.image.url }}"></li>
{% endfor %}
在我看来,这就是我所做的:
genres = Genre.objects.annotate(total=Count('albums', filter=Q(decade__name='sixties')))
效果很好 - 我正在成功检索我想要展示的十年的专辑总数。现在的问题是我如何也显示正确的图像?在 SQL 中,我会考虑一个子查询:
... (SELECT photo.image FROM album a JOIN photo ON album.photo = photo.id WHERE a.genre = genre.id AND photo.id IS NOT NULL) AS image ...
类似的东西。但我不确定在 Django 中执行此操作的正确方法是什么。我是否以某种方式用一条记录对其进行注释?我是否使用自定义模板过滤器(如果是,应该如何工作)?
【问题讨论】: