1

は、私は私のテンプレートではリリースされた音楽アルバムDjangoはForeignKeyの関連モデルの明確な「子供のリストを取得(およびテンプレートでこれを行う?)

models.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 %} 

それとも単純な場合には、私は、少なくともそれらの2つ以上が存在する場合、画像が小さく表示したいと思います。

{% 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) 

この外部キーの参照を元に戻し、その子のセットを尋ねると、関連するオブジェクトのリストを取得できますか?私が考えることができる唯一の方法は、ビュー内にいくつかのタプル/リストを組み立てることです。私はこの権利理解している場合

答えて

4

私はアルバムのモデル上の新しい方法でこれを管理:

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 

次にテンプレートがはるかに簡単です:このコードへの貢献のためにしかし@danilobargenする

{% for i in a.distinct_cover_images %} 

クレジット。

+0

ああ、もちろん、それはどういたしまして私の心を失った:)良い解決策。 –

+0

すばらしい答え...良いアイデアだが、私の実装に問題がある。私の「ForeginKey」関係は別のアプリの別のモデルです。私はこれがまだ動作すると思っていました。単にそのモデルをインポートするだけでしたが、関係に関係する両方のアプリケーションで 'ImportError'を引き起こしているようです。何か案は? – nicorellius

+0

特に、外部キーが他のアプリで定義されている場合、そのアプリは既にこのモジュールからモデルをインポートしているため、循環インポートのように聞こえます。ここでimport文を 'other_app import model'から' def distinct_cover_images(self) 'の行の関数定義の中に移動してみることができます – nimasmi

2

  • アルバムがリリースあなたは、アルバムのすべてのカバーをループにしたい
  • 一つだけのカバーを持っているいくつかのリリース
  • を持つことができますが

その場合は、次のように動作します:

{% for release in a.release_set.all %} 
    {{ release.cover_art.image }} 
{% endfor %} 

同一のカバーを表示しないようにするには、ループ内のカバーを比較するか、ビューに異なるカバーを含むセットを用意してテンプレートに渡すことができます。

第3の選択肢は、すべての別個のリリースカバーを返すために、アルバム用のカスタムテンプレートフィルタを作成することです。

いずれにしても、あなたのDjangoシェルでデバッグすることをお勧めします。 ./manage.py shellでシェルを発行することができます。 django-extensionsがインストールされている場合は、./manage.py shell_plusを使用してすべてのモデルを自動ロードすることもできます。引数を必要としないすべてのオブジェクト属性および関数(例えば、通常のインスタンス属性または'string'.isalnum()のような引数のないインスタンス関数)は、テンプレート内で同じ方法(括弧なし)で使用することもできます。

+0

はい、申し訳ありませんが、わたしははっきりしていたはずです。すでに作業用ループがです。それは私が後にしている重複の削除です。 – nimasmi

+0

@nimasmi可能な解決策の例を使って自分の編集を参照してください。 –

+0

@nimasmiリストの解説とセットの使用を妨げる別の解決策で私の答えを編集しました。 –

関連する問題