Получение результата, а фильтр имеет только связанное поле [Django-filter].

Я хочу создать django-фильтр, в котором при поиске книги по названию или содержанию пользователи получают результат, а фильтр имеет только связанное поле. А также в каждом поле есть количество содержащихся книг с номерами. Например, я ищу книгу о природе, я пишу "природа" в поле поиска в фильтре, а затем нажимаю "Поиск". Получаю результат и фильтр с соответствующими полями и результатами (например, фильтр имеет следующие значения - языковой фильтр: Английский (54), Немецкий (20) ; Издатель: Oxford (100), Seven House (21) и т.д.). Я хочу создать django фильтр, в котором когда пользователи ищут книгу по названию или содержанию, они получают результат, а фильтр имеет только связанное поле. А также в каждом поле есть количество содержащих книг с номерами. Например, я ищу книгу о природе, я пишу "природа" в поле поиска в фильтре, а затем нажимаю "Поиск". Получаю результат и фильтр с соответствующими полями и результатами (например, фильтр имеет следующие значения - языковой фильтр: Английский (54), Немецкий (20) ; Издатель: Оксфорд (100), Seven House (21) и т.д.). Как кратко сформулировать мои основные вопросы

  1. How to create a filter that after the request had values ​​relevant to the request?
  2. How to count this data in the filter?

models.py

class Book(models.Model):
   title = models.CharField(max_length=255)
   description = models.CharField(max_length=255)
   publisher = models.ForeignKey("Publisher", null=True, blank=True, on_delete=models.SET_NULL)
   language = models.ForeignKey("Language", null=True, blank=True, on_delete=models.SET_NULL)

class Publisher(models.Model):
    name = models.CharField(max_length=255)

class Language(models.Model):
    name = models.CharField(max_length=255)

books.hmtl

<div>
 {{filter.form.as_p}}
 {{filter.form.media}}
</div>

<div>
{% for book in filter.qs %}
    {{book.title}}
    {{book.description}}
{% endfor %}
</div>

filters.py

class BookFilter(django_filters.FilterSet):
    class Meta:
        model = Book
        fields = {
            "title",
            "description",
            "language",
            "publisher",
        }

views.py

def BookListView(request):

    book = Book.objects.all()
    filter = BookFilter(request.GET, queryset=books)

    context = {"books": books, "filter": filter}
    return render(request, "books.html", context)


Насколько я понимаю, у вас есть три требования.

  1. Получить все книги, содержащие искомые названия.

    books = Books.objects.filter(title__contains='nature').select_related('publisher', 'language')
    
  2. Получить список книг с учетом языка.

    books.values('language__name').annotate(count=Count('id'))
    
  3. Получение списка книг по издательству.

    books.values('publisher__name').annotate(count=Count('id'))
    
Вернуться на верх