Список фильтров фасетов с использованием 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 %}
Вернуться на верх