Bon je pense que j’ai un truc qui marche, je surcharge FacetMixin
de drf-haystack (celui qui fait des narrow
tout le temps) avec une version qui “groupe” comme je l’entends :
class FacetMixinMultiSelect(FacetMixin):
@action(detail=False, methods=["get"], url_path="facets")
def facets(self, request):
"""Sets up a list route for ``faceted`` results.
This will add ie ^search/facets/$ to your existing ^search pattern.
Here we're grouping selected facets by fields so we can OR
them inside the same fields.
So:
selected_facets=color:blue&selected_facets=color:red&selected_facets=size:L
will translate to:
(color:blue OR color:red) AND size:L
"""
queryset = self.filter_facet_queryset(self.get_queryset())
fields = defaultdict(list)
for facet in request.query_params.getlist(self.facet_query_params_text):
if ":" not in facet:
continue
field, value = facet.split(":", 1)
fields[field].append(value)
for field, values in fields.items():
queryset = queryset.narrow(
" OR ".join(
'%s:"%s"' % (field, queryset.query.clean(value)) for value in values
)
)
serializer = self.get_facet_serializer(
queryset.facet_counts(), objects=queryset, many=False
)
return Response(serializer.data)