filters.py 1.1 KB

123456789101112131415161718192021222324252627282930313233
  1. import django_filters
  2. from django.contrib.contenttypes.models import ContentType
  3. from .models import CustomField
  4. class CustomFieldFilter(django_filters.Filter):
  5. """
  6. Filter objects by the presence of a CustomFieldValue. The filter's name is used as the CustomField name.
  7. """
  8. def filter(self, queryset, value):
  9. if not value.strip():
  10. return queryset
  11. return queryset.filter(
  12. custom_field_values__field__name=self.name,
  13. custom_field_values__serialized_value=value,
  14. )
  15. class CustomFieldFilterSet(django_filters.FilterSet):
  16. """
  17. Dynamically add a Filter for each CustomField applicable to the parent model.
  18. """
  19. def __init__(self, *args, **kwargs):
  20. super(CustomFieldFilterSet, self).__init__(*args, **kwargs)
  21. obj_type = ContentType.objects.get_for_model(self._meta.model)
  22. custom_fields = CustomField.objects.filter(obj_type=obj_type, is_filterable=True)
  23. for cf in custom_fields:
  24. self.filters['cf_{}'.format(cf.name)] = CustomFieldFilter(name=cf.name)