This commit is contained in:
Mardanov Timur Rustemovich 2019-01-16 13:42:02 +03:00
parent e4fa8fe0b7
commit 30cd430c27
2 changed files with 23 additions and 3 deletions

View File

@ -113,6 +113,8 @@ class DjangoFilterConnectionField(DjangoConnectionField):
if not _parent:
_parent = is_parent_set(info)
source_class = default_manager.source
def new_resolver(root, info, **args):
#filters
@ -122,7 +124,20 @@ class DjangoFilterConnectionField(DjangoConnectionField):
qs = default_manager.filter()
if filters:
qs = qs.filter().filter(make_qs(filters))
base_filters, relationship_filters = make_qs(filters)
qs = qs.filter().filter(base_filters)
if relationship_filters:
rels = {}
for item in relationship_filters.items():
rel_field = getattr(source_class, item[0], None)
if rel_field is None:
raise Exception('This relationship field not found '
'in source class')
node_class = rel_field.build_manager(0, item[0]).definition['node_class']
rels[item[0]] = node_class.nodes.get(uid=item[1])
for item in rels.items():
qs = qs.has(**{item[0]: item[1]})
if order:
qs = qs.order_by(order)

View File

@ -14,11 +14,16 @@ def get_filterset_class(filterset_class, **meta):
def make_qs(filters):
relationship_filters = {}
for item in filters.items():
if '__equal' in item[0]:
if item[0].endswith('__equal'):
filters.pop(item[0])
filters[item[0].split("__")[0]] = item[1]
return reduce(lambda init, nx: init & Q(**{nx[0]: nx[1]}), filters.items(), Q())
elif item[0].endswith('__has'):
filters.pop(item[0])
relationship_filters[item[0].split("__")[0]] = item[1]
base_filters = reduce(lambda init, nx: init & Q(**{nx[0]: nx[1]}), filters.items(), Q())
return base_filters, relationship_filters
def get_filtering_args_from_filterset(filterset_class, type):