filter_queryset.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. EQUAL = 0
  2. CONTAINS = 1
  3. STARTS_WITH = 2
  4. ENDS_WITH = 3
  5. def filter_queryset(queryset, attr, search, *, case_sensitive=False):
  6. mode = get_mode(search)
  7. search = search.strip("*")
  8. if not search:
  9. return queryset
  10. queryset_filter = get_queryset_filter(
  11. attr, mode, search, case_sensitive=case_sensitive
  12. )
  13. return queryset.filter(**queryset_filter)
  14. def get_mode(search):
  15. if search.startswith("*") and search.endswith("*"):
  16. return CONTAINS
  17. if search.endswith("*"):
  18. return STARTS_WITH
  19. if search.startswith("*"):
  20. return ENDS_WITH
  21. return EQUAL
  22. def get_queryset_filter(attr, mode, search, *, case_sensitive=False):
  23. if mode is STARTS_WITH:
  24. if case_sensitive:
  25. return {"%s__startswith" % attr: search}
  26. return {"%s__istartswith" % attr: search}
  27. if mode is ENDS_WITH:
  28. if case_sensitive:
  29. return {"%s__endswith" % attr: search}
  30. return {"%s__iendswith" % attr: search}
  31. if mode is CONTAINS:
  32. if case_sensitive:
  33. return {"%s__contains" % attr: search}
  34. return {"%s__icontains" % attr: search}
  35. if case_sensitive:
  36. return {attr: search}
  37. return {"%s__iexact" % attr: search}