2016-08-08 16 views
0

Ich drucke eine Liste von Bieren, die mit einigen Filtern übereinstimmen, und die Balken, in denen jeder auf dem Hahn ist. Diese befinden sich in einer vielfachen Beziehung. Ich muss diese Liste von Balken filtern, um nur diejenigen in einem bestimmten Zustand zu zeigen.Django manytomany Feldfilterliste

Ich kann dies mit if-Anweisungen in der Vorlage erreichen, aber dann bin ich nicht in der Lage, die Kommata mit einem 'und' vor dem letzten Element (wie https://stackoverflow.com/a/3649002/6180992) zu formatieren, da ich die Länge der Liste nicht kenne .

Ich habe gedacht, drei Möglichkeiten, um dies möglich sein könnte, aber kann nicht an der Arbeit:

  • die Stäbe verwandten Bereich sowie die Biere in den Ansichten Filterung
  • die Liste in der Vorlage Zusammenbauen bevor er wieder Looping durch in der Vorlage

Hier sind die entsprechenden Abschnitte des Codes

  • Filterung der Bars verwandten Bereich drucken:

    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")) 
    

    Vorlage:

    {% 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 %} 
    
  • Antwort

    0

    können Sie prefetch verwenden zur Abfrage nur die dazugehörigen Bars, bevor es zu Vorlage zu senden, etwa so:

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

    Jetzt in Ihrer Vorlage verwenden, die benutzerdefinierte Attribut Sie zugewiesen:

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

    Weitere Informationen über Django docs für prefetch_related

    Hinweis : Die Verwendung von Prefetch für ManyToMany Relationen erhöht auch die Leistung, da nicht so viele Datenbank-Lookups vorhanden sind.

    +0

    Vielen Dank! Ich musste nur die .all in der Vorlage entfernen, aber ansonsten funktioniert das großartig! – MJHorn

    +0

    Froh, dass es geholfen hat :) –

    Verwandte Themen