[英]django get list of distinct 'children' of ForeignKey related model (and do this in template?)
我正在制作已發行音樂專輯的數據庫
模型.py
class Image(models.Model):
image = models.ImageField(....
class Album(models.Model):
title = models.CharField(....
class Release(models.Model):
album = models.ForeignKey(Album)
cover_art = models.ForeignKey(Image, blank=True, null=True, on_delete=models.SET_NULL)
在我的模板中(目前我使用的是通用視圖)我有:
{% for a in album_list %}
{% for r in a.release_set.all %}
{% if r.cover_art %}
# display cover art image
{% endif %}
{% endfor %}
{% endfor %}
問題是有時一張專輯已經發行了好幾次,封面都一樣,在這種情況下,我只想顯示一次圖像,並用一些文字列出它所屬的發行版。
我試過了:
{% for i in a.release_set.cover_art %}
{% for i in a.release_set.cover_art_set %}
{% for i in a.release_set.all.cover_art %}
{% for i in a.release_set.all.cover_art_set %}
或者在更簡單的情況下,如果有多個圖像,我至少希望將圖像顯示得更小。
{% if a.release_set.count > 1 %} # works but displays duplicate images
{% if a.release_set.cover_art_set.count > 1 %} # doesn't work (see above)
是否有可能通過反轉這個 ForeignKey 查找然后詢問他們的孩子的集合來獲得相關的對象列表? 我能想到的唯一方法是在視圖中組裝一些元組/列表。
我用相冊 model 上的一種新方法來管理它:
class Album(models.Model):
title = models.CharField(....
def distinct_cover_images(self):
"Returns the queryset of distinct images used for this album cover"
pks = self.release_set.all().values_list('cover_art__pk', flat=True)
distinct_cover_images = Images.objects.filter(pk__in=pks).distinct()
return distinct_cover_images
那么模板就簡單多了:
{% for i in a.distinct_cover_images %}
不過,感謝@danilobargen 對這段代碼的貢獻。
如果我理解正確的話:
在這種情況下,以下應該起作用:
{% for release in a.release_set.all %}
{{ release.cover_art.image }}
{% endfor %}
如果你想避免列出相同的封面,你可以在循環中比較封面,或者在你的視圖中准備一組不同的封面,這樣你就可以將它傳遞給模板。
# Solution using a set
context['distinct_coverimages'] = \
set([r.cover_art.image for r in album.release_set.all()])
# Solution using two queries, might perform better
pks = album.release_set.values_list('cover_art__pk', flat=True)
context['distinct_coverimages'] = models.Image.filter(pk__in=pks).distinct()
第三種選擇是為您的專輯創建一個自定義模板過濾器,以返回所有不同的發行封面。
無論如何,我建議在您的 Django shell 中調試此類內容。您可以使用./manage.py shell
。 如果你已經安裝了django-extensions ,你也可以使用./manage.py shell_plus
來自動加載所有模型。 所有不需要 arguments 的 object 屬性和函數(例如普通實例屬性或沒有 arguments 的實例函數,如'string'.isalnum()
)也可以在模板中以相同的方式使用(只是沒有括號)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.