У меня есть две модели, книги и жанры.

class Book(models.Model):
     title = models.CharField(max_length=300)
     author = models.CharField(max_length=100)
     year = models.IntegerField()
     genre = models.ForeignKey('Genre', on_delete=models.CASCADE)

class Genre(models.Model):
     title = models.CharField(max_length=20)

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

{% for genre in genres %}
     <h1> {{genre.title}} </h1>
     {% for book in genre.book_set.all %}
          {{book.title}}
     {% endfor %}
{% endfor %}

Проблема в том, что он показывает ВСЕ книги этого жанра, а не только книги, изданные после 1950 года. Можно ли каким-то образом отфильтровать результат genre.book_set.all, чтобы получить только те, которые соответствуют определенному атрибуту? ?

0
Andrew Einhorn 20 Апр 2020 в 14:04

2 ответа

Я бы порекомендовал вам сделать фильтрацию по вашему мнению, а не сам шаблон. Там вы можете использовать все функции djangos и вам не нужно реализовывать пользовательские теги / фильтры для шаблона. Затем вы также можете выполнить оптимизацию запросов с помощью select_ / prefetch_related позже (если вы получаете больше запросов).

Примере:

class myview(...):
    qs = Genre.objects.filter(book_set__year__gt=1950)
    ...

Также см. Полевые поиски в документах. для фильтрации с gt.

1
wfehr 20 Апр 2020 в 11:12

Как сказал пользователь wfehr, рекомендуется фильтровать данные в самом представлении. Но, тем не менее, в этом случае вы можете использовать условный рендеринг в качестве обходного пути.

{% for genre in genres %}
     <h1> {{genre.title}} </h1>
     {% for book in genre.book_set.all %}
       {% if book.year > 1950 %}
          {{book.title}}
       {% endif %}
     {% endfor %}
{% endfor %}

Вот ссылка для получения дополнительной информации.

Надеюсь, это поможет! Удачного кодирования!

0
Deekshith Anand 20 Апр 2020 в 11:27