2016-08-08 16 views
0

いくつかのフィルタと一致するビールのリストと、それぞれがタップされているバーを印刷しています。これらは数多くの関係にあります。特定の状態のものだけを表示するには、このバーのリストをフィルタリングする必要があります。Django manytomanyフィールドフィルタリスト

テンプレート内のif文を使用してこれを実現できますが、リストの長さが分からないため、最後の項目の前に「and」を付けるように書式を設定することはできません(https://stackoverflow.com/a/3649002/6180992など)。 。

私はこれが可能であるかもしれない三つの方法を考えてきたが、仕事へのいずれかを取得することはできません

  • バー関連のフィールドをフィルタリングだけでなく、ビュー
  • でビールがテンプレートでリストを組み立てますテンプレート内のバー関連のフィールドをフィルタリングし、それを
  • を印刷するために、再度を通じてループする前に、ここで

はコードの関連セクションです:

models.py

class Bar(models.Model): 
    bar = models.CharField(max_length=200, default='FinshnPig') 
    state = models.CharField(max_length=200,default='NY') 

    def __str__(self): 
     return self.bar 
    class Meta: 
     ordering = ('bar','region') 


class Tap(models.Model): 
    bar = models.ManyToManyField(Bar,default='FinshnPig') 
    brewery = models.CharField(max_length=200) 
    beer = models.CharField(max_length=200) 
    state = models.CharField(max_length=200, default='NY') 

    def __str__(self): 
     return self.beer    

views.py

f = TapFilter(request.GET, queryset=Tap.objects.filter(state="VIC")) 

テンプレート:

{% for tap in filter %} 
    <li> 
    <b>{{ tap.beer }}</b> 
    <em>{{ tap.brewery }}</em> 
    @{% for bar in tap.bar.all %}{% if bar.state == "VIC" %}{{ bar.bar }}</b>{% endif %}{% include "taplists/comma.html" %}{% endfor %} 
    </li> 
{% endfor %} 

答えて

0

あなたは照会のためprefetchを使用することができますprefetch_related

注Djangoのドキュメント上

{% for tap in filter %} 
    # Now selected_bars only contains the bars in the state you want 
    {% for bar in tap.selected_bars.all %} 
    ... 
    {% endfor %} 
{% endfor %} 

追加情報:あなたが割り当てられたカスタム属性を使用して、テンプレート内で今

prefetch = Prefetch(
    'bar', 
    queryset=Bar.objects.filter(state=CHOSEN_STATE), 
    to_attr='selected_states' 
) 
filter = Tap.objects.filter(state=CHOSEN_STATE).prefetch_related(prefetch) 

:そうのように、テンプレートに送信する前に、関連するバーのみ:プリフェッチをManyToManyリレーションシップに使用すると、多くのデータベース検索が行われないため、パフォーマンスが向上します。

+0

ありがとうございました!私はちょうどテンプレートの.allを削除しなければならなかったが、そうでなければこれはすごくうまくいった! – MJHorn

+0

うれしかったよ:) –

関連する問題