Skip to content

Commit 7085437

Browse files
author
Niall
committed
Fix filtering with a resolver and DjangoFilter filter.
1 parent 1139507 commit 7085437

File tree

2 files changed

+108
-3
lines changed

2 files changed

+108
-3
lines changed

graphene_django/fields.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def connection_resolver(resolver, connection, default_manager, root, args, conte
5454
iterable = maybe_queryset(iterable)
5555
if isinstance(iterable, QuerySet):
5656
if iterable is not default_manager:
57-
iterable &= maybe_queryset(default_manager)
57+
iterable = maybe_queryset(default_manager)
5858
_len = iterable.count()
5959
else:
6060
_len = len(iterable)

graphene_django/tests/test_query.py

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@
55
from django.utils.functional import SimpleLazyObject
66
from py.test import raises
77

8+
from django_filters import FilterSet, NumberFilter
9+
810
import graphene
911
from graphene.relay import Node
1012

1113
from ..utils import DJANGO_FILTER_INSTALLED
1214
from ..compat import MissingType, JSONField
1315
from ..fields import DjangoConnectionField
16+
from ..filter.fields import DjangoFilterConnectionField
1417
from ..types import DjangoObjectType
1518
from .models import Article, Reporter
1619

@@ -42,7 +45,6 @@ class Meta:
4245
model = Reporter
4346
only_fields = ('id', )
4447

45-
4648
class Query(graphene.ObjectType):
4749
reporter = graphene.Field(ReporterType)
4850

@@ -360,7 +362,110 @@ class Query(graphene.ObjectType):
360362
}]
361363
}
362364
}
363-
365+
366+
result = schema.execute(query)
367+
assert not result.errors
368+
assert result.data == expected
369+
370+
371+
def test_should_query_filter_node_limit():
372+
class ReporterFilter(FilterSet):
373+
limit = NumberFilter(method='filter_limit')
374+
375+
def filter_limit(self, queryset, name, value):
376+
return queryset[:value]
377+
378+
class Meta:
379+
model = Reporter
380+
fields = ['first_name', ]
381+
382+
class ReporterType(DjangoObjectType):
383+
384+
class Meta:
385+
model = Reporter
386+
interfaces = (Node, )
387+
388+
class ArticleType(DjangoObjectType):
389+
390+
class Meta:
391+
model = Article
392+
interfaces = (Node, )
393+
filter_fields = ('lang', )
394+
395+
class Query(graphene.ObjectType):
396+
all_reporters = DjangoFilterConnectionField(
397+
ReporterType,
398+
filterset_class=ReporterFilter
399+
)
400+
401+
def resolve_all_reporters(self, args, context, info):
402+
return Reporter.objects.all()
403+
404+
r = Reporter.objects.create(
405+
first_name='John',
406+
last_name='Doe',
407+
408+
a_choice=1
409+
)
410+
Reporter.objects.create(
411+
first_name='Bob',
412+
last_name='Doe',
413+
414+
a_choice=1
415+
)
416+
417+
Article.objects.create(
418+
headline='Article Node 1',
419+
pub_date=datetime.date.today(),
420+
reporter=r,
421+
editor=r,
422+
lang='es'
423+
)
424+
Article.objects.create(
425+
headline='Article Node 2',
426+
pub_date=datetime.date.today(),
427+
reporter=r,
428+
editor=r,
429+
lang='en'
430+
)
431+
432+
schema = graphene.Schema(query=Query)
433+
query = '''
434+
query NodeFilteringQuery {
435+
allReporters(limit: 1) {
436+
edges {
437+
node {
438+
id
439+
articles(lang: "es") {
440+
edges {
441+
node {
442+
id
443+
}
444+
}
445+
}
446+
}
447+
}
448+
}
449+
}
450+
'''
451+
452+
expected = {
453+
'allReporters': {
454+
'edges': [{
455+
'node': {
456+
'id': 'UmVwb3J0ZXJUeXBlOjE=',
457+
'articles': {
458+
'edges': [{
459+
'node': {
460+
'id': 'QXJ0aWNsZVR5cGU6MQ=='
461+
}
462+
}]
463+
}
464+
}
465+
}]
466+
}
467+
}
468+
364469
result = schema.execute(query)
365470
assert not result.errors
366471
assert result.data == expected

0 commit comments

Comments
 (0)