Skip to content

Commit

Permalink
Fixed performance bug on some queries when request nested ManyToMany …
Browse files Browse the repository at this point in the history
…fields.
  • Loading branch information
Ernesto Perez Amigo committed Dec 22, 2017
1 parent c30e703 commit 8bc3f19
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 7 deletions.
2 changes: 1 addition & 1 deletion graphene_django_extras/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from .paginations import LimitOffsetGraphqlPagination, PageGraphqlPagination, CursorGraphqlPagination
from .types import DjangoObjectType, DjangoInputObjectType, DjangoListObjectType, DjangoSerializerType

VERSION = (0, 2, 1, 'final', '')
VERSION = (0, 2, 2, 'final', '')

__version__ = get_version(VERSION)

Expand Down
37 changes: 32 additions & 5 deletions graphene_django_extras/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,13 +85,40 @@ def model(self):

@staticmethod
def list_resolver(manager, filterset_class, filtering_args, root, info, **kwargs):
filter_kwargs = {k: v for k, v in kwargs.items() if k in filtering_args}
qs = queryset_factory(manager, info.field_asts, info.fragments, **kwargs)
qs = filterset_class(data=filter_kwargs, queryset=qs).qs
qs = None
field = None

if root and is_valid_django_model(root._meta.model):
extra_filters = get_extra_filters(root, manager.model)
qs = qs.filter(**extra_filters)
available_related_fields = get_related_fields(root._meta.model)
field = find_field(
info.field_asts[0], available_related_fields
)
filter_kwargs = {
k: v for k, v in kwargs.items() if k in filtering_args
}

if field is not None:
try:
if filter_kwargs:
qs = operator.attrgetter(
'{}.filter'.format(
getattr(field, 'related_name', None) or field.name)
)(root)(**filter_kwargs)
else:
qs = operator.attrgetter(
'{}.all'.format(
getattr(field, 'related_name', None) or field.name)
)(root)()
except AttributeError:
qs = None

if qs is None:
qs = queryset_factory(manager, info.field_asts, info.fragments, **kwargs)
qs = filterset_class(data=filter_kwargs, queryset=qs).qs

if root and is_valid_django_model(root._meta.model):
extra_filters = get_extra_filters(root, manager.model)
qs = qs.filter(**extra_filters)

return maybe_queryset(qs)

Expand Down
2 changes: 1 addition & 1 deletion graphene_django_extras/paginations/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
__all__ = [
'LimitOffsetGraphqlPagination',
'PageGraphqlPagination',
'CursorGraphqlPagination', # Not implemented yet
# 'CursorGraphqlPagination', # Not implemented yet
]

0 comments on commit 8bc3f19

Please sign in to comment.