Last active
February 17, 2019 13:42
-
-
Save ncopiy/50c57452850c22ec389b9b4bf0d73112 to your computer and use it in GitHub Desktop.
JSON Text Field Filter (django + django-filters)
This file contains 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
class JSONTextFieldFilter(Filter): | |
json_field_name = "" | |
choices = {} | |
def __init__(self, json_field_name=None, choices=None, **kwargs): | |
self.choices = choices if choices else {} | |
self.json_field_name = json_field_name if json_field_name else "" | |
super().__init__(**kwargs) | |
def modify_value(self, value): | |
value = json.dumps({self.json_field_name: self.choices.get(value.lower(), value)}) | |
return value[1:-1] # remove first '{' character and last - '}' | |
def filter(self, qs, value): | |
if isinstance(value, Lookup): | |
lookup = six.text_type(value.lookup_type) | |
value = value.value | |
else: | |
lookup = self.lookup_expr | |
if value in EMPTY_VALUES: | |
return qs | |
value = self.modify_value(value) | |
qs = self.get_method(qs)(**{'%s__%s' % (self.field_name, lookup): value}) | |
if self.distinct: | |
qs = qs.distinct() | |
return qs | |
class RelatedJSONTextFieldFilter(JSONTextFieldFilter): | |
related_field_name = None | |
def __init__(self, related_field_name=None, **kwargs): | |
self.related_field_name = related_field_name | |
super().__init__(**kwargs) | |
def filter(self, qs, value): | |
if isinstance(value, Lookup): | |
lookup = six.text_type(value.lookup_type) | |
value = value.value | |
else: | |
lookup = self.lookup_expr | |
value = self.modify_value(value) | |
qs = qs.prefetch_related(self.field_name).filter( | |
**{'%s__%s__%s' % (self.field_name, self.related_field_name, lookup): value}) | |
if self.distinct: | |
qs = qs.distinct() | |
return qs |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment