Список фильтров фасетов с использованием django-filter
Я пытаюсь построить фасетный фильтр, используя django-filter. Также в фильтре у меня есть полнотекстовый поиск Postgres. Фильтр и поиск работают хорошо, но я не знаю, как построить facet Filter.
Например, я хочу, чтобы при выборе китайского языка я видел подсчет каждого значения и связанного с ним значения в фильтре.
Могли бы вы дать мне совет, как его построить?
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 }}
<br />
{% endfor %}
{% endblock %}