From fa6e2f7dd2bb933c0ca826df0cc4aacf6f9b428f Mon Sep 17 00:00:00 2001 From: Lubos Zlatohlavek Date: Wed, 26 Nov 2025 10:21:18 +0100 Subject: [PATCH 1/2] triv: #25225 added filter widget for ArrayField --- pyproject.toml | 2 +- src/django_smartbase_admin/engine/filter_widgets.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index a6b4b181..4760917a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "django-smartbase-admin" -version = "1.0.33" +version = "1.0.34" description = "" authors = ["SmartBase "] readme = "README.md" diff --git a/src/django_smartbase_admin/engine/filter_widgets.py b/src/django_smartbase_admin/engine/filter_widgets.py index f858d852..72e07e78 100644 --- a/src/django_smartbase_admin/engine/filter_widgets.py +++ b/src/django_smartbase_admin/engine/filter_widgets.py @@ -259,6 +259,14 @@ def get_advanced_filter_operators(self): ] +class ArrayFieldMultipleChoiceFilterWidget(MultipleChoiceFilterWidget): + def get_base_filter_query_for_parsed_value(self, request, filter_value): + q_objects = Q() + for value in filter_value: + q_objects |= Q(**{f"{self.field.filter_field}__contains": [value]}) + return q_objects + + class NumberRangeFilterWidget(AutocompleteParseMixin, SBAdminFilterWidget): template_name = "sb_admin/filter_widgets/number_range_field.html" From 5586706dc4db5758b526376caf67ebb03befb6a9 Mon Sep 17 00:00:00 2001 From: Lubos Zlatohlavek Date: Wed, 26 Nov 2025 12:43:10 +0100 Subject: [PATCH 2/2] triv: #25225 added support for array filtering in choice filters --- .../engine/filter_widgets.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/django_smartbase_admin/engine/filter_widgets.py b/src/django_smartbase_admin/engine/filter_widgets.py index 72e07e78..dc1299e1 100644 --- a/src/django_smartbase_admin/engine/filter_widgets.py +++ b/src/django_smartbase_admin/engine/filter_widgets.py @@ -2,6 +2,7 @@ from datetime import datetime, timedelta from django.core.exceptions import ImproperlyConfigured +from django.contrib.postgres.fields import ArrayField from django.db.models import Q, fields, FilteredRelation, Count from django.http import JsonResponse from django.utils import timezone @@ -212,6 +213,8 @@ def get_default_label(self): return found_label[0] if found_label else default_value def get_base_filter_query_for_parsed_value(self, request, filter_value): + if isinstance(self.model_field, ArrayField): + return Q(**{f"{self.field.filter_field}__contains": [filter_value]}) return Q(**{self.field.filter_field: filter_value}) @@ -248,6 +251,11 @@ def __init__( self.select_all_label = select_all_label def get_base_filter_query_for_parsed_value(self, request, filter_value): + if isinstance(self.model_field, ArrayField): + q_objects = Q() + for value in filter_value: + q_objects |= Q(**{f"{self.field.filter_field}__contains": [value]}) + return q_objects return Q(**{f"{self.field.filter_field}__in": filter_value}) def get_advanced_filter_operators(self): @@ -259,14 +267,6 @@ def get_advanced_filter_operators(self): ] -class ArrayFieldMultipleChoiceFilterWidget(MultipleChoiceFilterWidget): - def get_base_filter_query_for_parsed_value(self, request, filter_value): - q_objects = Q() - for value in filter_value: - q_objects |= Q(**{f"{self.field.filter_field}__contains": [value]}) - return q_objects - - class NumberRangeFilterWidget(AutocompleteParseMixin, SBAdminFilterWidget): template_name = "sb_admin/filter_widgets/number_range_field.html"