簡體   English   中英

django 獲取外鍵相關的不同“子項”列表 model(並在模板中執行此操作?)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM