Skip to content

Instantly share code, notes, and snippets.

@justindarc
Created July 25, 2025 19:54
Show Gist options
  • Save justindarc/21b19578658fe5015317e63ec1d1095a to your computer and use it in GitHub Desktop.
Save justindarc/21b19578658fe5015317e63ec1d1095a to your computer and use it in GitHub Desktop.
Dynamic FilterSet generator for Django Rest Framework
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