Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement