Skip to content
Snippets Groups Projects
Unverified Commit e82b7618 authored by Max Peterson's avatar Max Peterson Committed by GitHub
Browse files

Move the OptimizedDjangoObjectType query optimization to from get_node to get_queryset (#50)

DjangoObjectType.get_node calls get_queryset so this approach offers
support for more cases and works with DjangoFilterConnectionField.
parent 802922d1
No related branches found
No related tags found
No related merge requests found
...@@ -15,29 +15,8 @@ class OptimizedDjangoObjectType(DjangoObjectType): ...@@ -15,29 +15,8 @@ class OptimizedDjangoObjectType(DjangoObjectType):
and resolver_info.return_type.graphene_type is cls) and resolver_info.return_type.graphene_type is cls)
@classmethod @classmethod
def get_optimized_node(cls, info, qs, pk): def get_queryset(cls, queryset, info):
return query(qs, info).get(pk=pk) queryset = super(OptimizedDjangoObjectType, cls).get_queryset(queryset, info)
if cls.can_optimize_resolver(info):
@classmethod queryset = query(queryset, info)
def maybe_optimize(cls, info, qs, pk): return queryset
try:
if cls.can_optimize_resolver(info):
return cls.get_optimized_node(info, qs, pk)
return qs.get(pk=pk)
except cls._meta.model.DoesNotExist:
return None
@classmethod
def get_node(cls, info, id):
"""
Bear in mind that if you are overriding this method get_node(info, pk),
you should always call maybe_optimize(info, qs, pk)
and never directly call get_optimized_node(info, qs, pk) as it would
result to the node being attempted to be optimized when it is not
supposed to actually get optimized.
:param info:
:param id:
:return:
"""
return cls.maybe_optimize(info, cls._meta.model.objects, id)
...@@ -83,3 +83,31 @@ def test_mutating_should_not_optimize(mocked_optimizer): ...@@ -83,3 +83,31 @@ def test_mutating_should_not_optimize(mocked_optimizer):
assert result assert result
assert result.pk == 7 assert result.pk == 7
assert mocked_optimizer.call_count == 0 assert mocked_optimizer.call_count == 0
@pytest.mark.django_db
@patch('graphene_django_optimizer.types.query',
return_value=SomeOtherItem.objects)
def test_should_optimize_the_queryset(mocked_optimizer):
SomeOtherItem.objects.create(pk=7, name='Hello')
info = create_resolve_info(schema, '''
query ItemDetails {
someOtherItems(id: $id) {
id
foo
parent {
id
}
}
}
''')
info.return_type = schema.get_type('SomeOtherItemType')
qs = SomeOtherItem.objects.filter(pk=7)
result = SomeOtherItemType.get_queryset(qs, info).get()
assert result, 'Expected the item to be found and returned'
assert result.pk == 7, 'The item is not the correct one'
mocked_optimizer.assert_called_once_with(qs, info)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment