Last active
March 15, 2018 07:01
-
-
Save hwshim0810/6edb0ed4b488d5145ee340b6382d77c3 to your computer and use it in GitHub Desktop.
Django queryset filter by builderpattern
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
| 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