Как фильтровать связанные объекты после поиска в django-filter?
Я использую django-filter на своем сайте для поиска книг. Фильтр включает следующие поля: жанр книги, язык, на котором написана книга, дата публикации и поле поиска. Поиск ищет по нескольким полям в базе данных, включая название книги, авторов книги и т.д. Фильтр работает нормально, но я не понимаю, как сделать так, чтобы при поиске книги после получения результата поиска я удалял поля, не имеющие отношения к результату (т.е. жанры, язык). Например, я хочу найти книги о Гарри Поттере. После того как я ввел название книги в результат поиска и связанные с ним поля, то есть сайт, я вижу, что к книге о Гарри Поттере не имеет отношения китайский язык (он был удален после получения результата). Второй вопрос - можно ли сделать так, чтобы после поиска я видел, сколько объектов находится в каждом поле? То есть, если я ввел в поиск Гарри Поттер и получил результат, то я вижу, что в английском языке есть 5 объектов.
models.py
class Book(models.Model):
name = models.CharField(max_length=255)
author = models.ForeignKey(
"Authors",
on_delete=models.SET_NULL,
null=True,
blank=True,
)
subject = TreeManyToManyField("Subject")
published_date = models.DateField(blank=True, null=True)
language = models.ForeignKey(
"Language", on_delete=models.SET_NULL, null=True)
class Subject(MPTTModel):
name = models.CharField(
max_length=1000,
unique=True,
)
class Language(models.Model):
name = models.CharField(
max_length=255,
unique=True,
)
class Authors(models.Model):
name = models.CharField(
max_length=255,
unique=True,
)
filters.py
class BookFilter(django_filters.FilterSet):
search = django_filters.CharFilter(
method="my_custom_filter",
widget=TextInput(
attrs={
"class": "form-control",
"placeholder": _("Type to search"),
}
),
)
language = django_filters.ModelMultipleChoiceFilter(
field_name="language",
queryset=Language.objects.order_by("name"),
widget=forms.CheckboxSelectMultiple(),
)
subject = django_filters.ModelMultipleChoiceFilter(
field_name="subject",
queryset=Subject.objects.all(),
widget=autocomplete.ModelSelect2Multiple(}
),
)
class Meta:
model = Book
fields = {
"subject",
"language",
"published_date",
}
def my_custom_filter(self, queryset, name, value):
q = value
return (
queryset.annotate(
rank=SearchRank(vector, q),
similarity=TrigramSimilarity("title", q)
+ similarity=TrigramSimilarity("author", q)
)
views.py
def BookListView(request):
book = Book.objects.all()
filter = BookFilter(request.GET, queryset=book)
context = {
"filter": filter,
"book": book,
}
return render(request, "book.html", context)
book.html
{% extends "base.html" %}
{% block content %}
<form method="get">
{{ filter.form.as_p }}
<input type="submit" />
</form>
{% for obj in filter.qs %}
{{ obj.name }} - ${{ obj.price }}<br />
{% endfor %}
{% endblock %}