Skip to content

Instantly share code, notes, and snippets.

@ncopiy
Last active February 17, 2019 13:42
Show Gist options
  • Save ncopiy/50c57452850c22ec389b9b4bf0d73112 to your computer and use it in GitHub Desktop.
Save ncopiy/50c57452850c22ec389b9b4bf0d73112 to your computer and use it in GitHub Desktop.
JSON Text Field Filter (django + django-filters)
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