Last active
August 27, 2024 11:53
-
-
Save niccolomineo/bc48e01d4a9563d45039ae59005b2ac0 to your computer and use it in GitHub Desktop.
Django ArrayField inheritable list filter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"""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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
It does not work with multiple values.