Skip to content

Instantly share code, notes, and snippets.

@erfan-mehraban
Last active June 18, 2019 12:28
Show Gist options
  • Save erfan-mehraban/fd0ffa03f17d8e967d016a65e55af4e9 to your computer and use it in GitHub Desktop.
Save erfan-mehraban/fd0ffa03f17d8e967d016a65e55af4e9 to your computer and use it in GitHub Desktop.
filter for union all model field (in query param) for django rest framework
from rest_framework import filters
from django.db.models import Q
class UnionFilterBackend(filters.BaseFilterBackend):
"""
Filter that make union queryset with given query parametes
and model filter wich defined in filter_fields
Usage:
[url]/?foo=bar&foo=baz&xyzzy=qux
queryset will be : [queryset].filter(foo=bar or foo=baz or xyzzy=qux)
"""
def filter_queryset(self, request, queryset, view):
field_lookups = None
for field in view.filter_fields:
for filter_value in dict(request.query_params).get(field, []):
if field_lookups: # union prev lookups with current filter_value
field_lookups = field_lookups | Q(**{field:filter_value})
else: # fill first lookup
field_lookups = Q(**{field:filter_value})
if field_lookups:
queryset = queryset.filter(field_lookups)
return queryset
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment