Skip to content

Instantly share code, notes, and snippets.

@hwshim0810
Last active March 15, 2018 07:01
Show Gist options
  • Select an option

  • Save hwshim0810/6edb0ed4b488d5145ee340b6382d77c3 to your computer and use it in GitHub Desktop.

Select an option

Save hwshim0810/6edb0ed4b488d5145ee340b6382d77c3 to your computer and use it in GitHub Desktop.
Django queryset filter by builderpattern
import operator
from functools import reduce
from django.db.models import Q
class QueryBuilder:
"""
Continuous queryset filtering
"""
def __init__(self, queryset):
self.queryset = queryset
@staticmethod
def __get_filled_item_keys(items):
fields = []
for item in items:
if item[1]:
fields.append(item[0])
return fields
def conditional_filtering(self, field_name, value):
if value:
self.queryset = self.queryset.filter(**{field_name: value})
return self
def single_value_sum_filtering(self, fields, value):
if value:
condition = reduce(
operator.or_,
[Q(**{field: value}) for field in fields]
)
self.queryset = self.queryset.filter(condition)
return self
def multi_value_sum_filtering(self, **kwargs):
fields = self.__get_filled_item_keys(kwargs.items())
if fields.__len__() > 0:
condition = reduce(
operator.or_,
[Q(**{field: kwargs[field]}) for field in fields]
)
self.queryset = self.queryset.filter(condition)
return self
def build(self):
return self.queryset
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment