Skip to content

Instantly share code, notes, and snippets.

@niccolomineo
Last active August 27, 2024 11:53
Show Gist options
  • Save niccolomineo/bc48e01d4a9563d45039ae59005b2ac0 to your computer and use it in GitHub Desktop.
Save niccolomineo/bc48e01d4a9563d45039ae59005b2ac0 to your computer and use it in GitHub Desktop.
Django ArrayField inheritable list filter
"""Django filters."""
from django.contrib.admin import SimpleListFilter
class ArrayFieldListFilter(SimpleListFilter):
"""An admin list filter for ArrayFields."""
def lookups(self, request, model_admin):
"""Return the lookups."""
queryset_values = model_admin.model.objects.values_list(
self.parameter_name, flat=True
)
values = []
for sublist in queryset_values:
if sublist:
for value in sublist:
if value:
values.append((value, value))
else:
values.append(("null", "-"))
return sorted(set(values))
def queryset(self, request, queryset):
"""Return the filtered queryset."""
lookup_value = self.value()
if lookup_value:
lookup_filter = (
{"{}__isnull".format(self.parameter_name): True}
if lookup_value == "null"
else {"{}__contains".format(self.parameter_name): [lookup_value]}
)
queryset = queryset.filter(**lookup_filter)
return queryset
@hipertracker
Copy link

It does not work with multiple values.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment