Created
July 25, 2025 19:54
-
-
Save justindarc/21b19578658fe5015317e63ec1d1095a to your computer and use it in GitHub Desktop.
Dynamic FilterSet generator for Django Rest Framework
This file contains hidden or 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
| from django.db.models import ManyToOneRel | |
| from django_filters import rest_framework as filters | |
| def get_dynamic_filterset_filters(model_cls, prefix=None): | |
| """Get dynamic dictionary containing all fields and filter expressions for the specified model class.""" | |
| field_filters = {} | |
| for field in model_cls._meta.get_fields(): | |
| if isinstance(field, ManyToOneRel): | |
| continue | |
| field_name = f"{prefix}__{field.name}" if prefix else field.name | |
| match field.get_internal_type(): | |
| case "JSONField": | |
| continue | |
| case "CharField": | |
| field_filters[field_name] = ["exact", "icontains"] | |
| case "DateField" | "DateTimeField": | |
| field_filters[field_name] = ["exact", "gt", "lt", "range"] | |
| case "DecimalField" | "FloatField" | "IntegerField": | |
| field_filters[field_name] = ["exact", "gt", "gte", "lt", "lte"] | |
| case "ForeignKey": | |
| field_filters[f"{field_name}_id"] = ["exact"] | |
| if field.related_model: | |
| field_filters.update(get_dynamic_filterset_filters(field.related_model, field_name)) | |
| case _: | |
| field_filters[field_name] = ["exact"] | |
| return field_filters | |
| def get_dynamic_filterset_class(model_cls): | |
| """Get dynamic FilterSet class for the specified model class.""" | |
| class Meta: | |
| model = model_cls | |
| fields = get_dynamic_filterset_filters(model_cls) | |
| return type(f"{model_cls.__name__}FilterSet", (filters.FilterSet,), {"Meta": Meta}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment