diff --git a/netbox/extras/filters.py b/netbox/extras/filters.py index 6bd5f3737..474410e65 100644 --- a/netbox/extras/filters.py +++ b/netbox/extras/filters.py @@ -19,17 +19,28 @@ class CustomFieldFilter(django_filters.Filter): super(CustomFieldFilter, self).__init__(*args, **kwargs) def filter(self, queryset, value): + # Skip filter on empty value if not value.strip(): return queryset - # Treat 0 as None for Select fields - try: - if self.cf_type == CF_TYPE_SELECT and int(value) == 0: - return queryset.exclude( - custom_field_values__field__name=self.name, - ) - except ValueError: - pass + + # Selection fields get special treatment (values must be integers) + if self.cf_type == CF_TYPE_SELECT: + try: + # Treat 0 as None + if int(value) == 0: + return queryset.exclude( + custom_field_values__field__name=self.name, + ) + # Match on exact CustomFieldChoice PK + else: + return queryset.filter( + custom_field_values__field__name=self.name, + custom_field_values__serialized_value=value, + ) + except ValueError: + return queryset.none() + return queryset.filter( custom_field_values__field__name=self.name, custom_field_values__serialized_value__icontains=value,