Django не фильтрует результаты «многие ко многим» в шаблоне

#django

#django

Вопрос:

У меня есть приложение, в котором люди могут голосовать за нескольких артистов. На странице результатов я хочу выполнить фильтрацию по стране. Другими словами: я не хочу показывать только те голоса, которые поданы из определенной страны. Подсчет голосов работает, но в шаблоне по-прежнему отображаются все электронные письма избирателей, а не только из страны в фильтре.

Моя модель:

 class Artist(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField('Artist name', max_length=100)
    def __str__(self):
        return self.name 


class Vote(models.Model):
    email = models.EmailField(null=True)
    country = CountryField(default="US")
    artists = models.ManyToManyField(Artist, related_name='selectedartists')

    def __str__(self):
        return self.email
 

Часть представления, в которой выполняется фильтрация:

 results = Artist.objects.filter(selectedartists__isnull=False)

if countryquery == '' or countryquery == 'all':
            countryquery = 'all'
            results = results.annotate(total=Count('selectedartists', distinct=True))

        else:
            results = results.filter(selectedartists__country=countryquery)
            results = results.annotate(total=Count('selectedartists', filter=Q(selectedartists__country=countryquery), distinct=True))
 

и это мой шаблон

 {% if results %}
    {% for artist in results %}
        {{artist.name}} Votes:{ artist.total }}
        Voters: {{artist.selectedartists.all|join:', '}}
    {% endfor %}
{% else %}
    <div class="noresults">No results</div>
{% endif %}
 

Ответ №1:

Надеюсь, это поможет, я считаю, что лучший подход — упростить это:

 {% if results %}
{% for artist in results %}
    {{artist.name}} Votes:{ artist.total }}
    Voters: {% for voter in artist.selectedartists.all %} 
             {{ voter }},{% endfor %}
    {% endfor %}
{% else %}
    <div class="noresults">No results</div>
{% endif %}