Skip to content

Commit 379954d

Browse files
authored
Merge pull request #2 from sebsasto/add-external-resolver
Fix: Use resolver passed as an attribute
2 parents 352f136 + da6ee4c commit 379954d

File tree

2 files changed

+94
-1
lines changed

2 files changed

+94
-1
lines changed

graphene_django/fields.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,13 @@ def list_resolver(
6161
return queryset
6262

6363
def wrap_resolve(self, parent_resolver):
64+
resolver = super(DjangoListField, self).wrap_resolve(parent_resolver)
6465
_type = self.type
6566
if isinstance(_type, NonNull):
6667
_type = _type.of_type
6768
django_object_type = _type.of_type.of_type
6869
return partial(
69-
self.list_resolver, django_object_type, parent_resolver, self.get_manager(),
70+
self.list_resolver, django_object_type, resolver, self.get_manager(),
7071
)
7172

7273

graphene_django/tests/test_fields.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,3 +408,95 @@ class Query(ObjectType):
408408
{"firstName": "Debra", "articles": []},
409409
]
410410
}
411+
412+
def test_resolve_list_external_resolver(self):
413+
"""Resolving a plain list from external resolver should work (and not call get_queryset)"""
414+
415+
class Reporter(DjangoObjectType):
416+
class Meta:
417+
model = ReporterModel
418+
fields = ("first_name", "articles")
419+
420+
@classmethod
421+
def get_queryset(cls, queryset, info):
422+
# Only get reporters with at least 1 article
423+
return queryset.annotate(article_count=Count("articles")).filter(
424+
article_count__gt=0
425+
)
426+
427+
def resolve_reporters(_, info):
428+
return [ReporterModel.objects.get(first_name="Debra")]
429+
430+
class Query(ObjectType):
431+
reporters = DjangoListField(Reporter, resolver=resolve_reporters)
432+
433+
schema = Schema(query=Query)
434+
435+
query = """
436+
query {
437+
reporters {
438+
firstName
439+
}
440+
}
441+
"""
442+
443+
r1 = ReporterModel.objects.create(first_name="Tara", last_name="West")
444+
ReporterModel.objects.create(first_name="Debra", last_name="Payne")
445+
446+
ArticleModel.objects.create(
447+
headline="Amazing news",
448+
reporter=r1,
449+
pub_date=datetime.date.today(),
450+
pub_date_time=datetime.datetime.now(),
451+
editor=r1,
452+
)
453+
454+
result = schema.execute(query)
455+
456+
assert not result.errors
457+
assert result.data == {"reporters": [{"firstName": "Debra"}]}
458+
459+
def test_get_queryset_filter_external_resolver(self):
460+
class Reporter(DjangoObjectType):
461+
class Meta:
462+
model = ReporterModel
463+
fields = ("first_name", "articles")
464+
465+
@classmethod
466+
def get_queryset(cls, queryset, info):
467+
# Only get reporters with at least 1 article
468+
return queryset.annotate(article_count=Count("articles")).filter(
469+
article_count__gt=0
470+
)
471+
472+
def resolve_reporters(_, info):
473+
return ReporterModel.objects.all()
474+
475+
class Query(ObjectType):
476+
reporters = DjangoListField(Reporter, resolver=resolve_reporters)
477+
478+
schema = Schema(query=Query)
479+
480+
query = """
481+
query {
482+
reporters {
483+
firstName
484+
}
485+
}
486+
"""
487+
488+
r1 = ReporterModel.objects.create(first_name="Tara", last_name="West")
489+
ReporterModel.objects.create(first_name="Debra", last_name="Payne")
490+
491+
ArticleModel.objects.create(
492+
headline="Amazing news",
493+
reporter=r1,
494+
pub_date=datetime.date.today(),
495+
pub_date_time=datetime.datetime.now(),
496+
editor=r1,
497+
)
498+
499+
result = schema.execute(query)
500+
501+
assert not result.errors
502+
assert result.data == {"reporters": [{"firstName": "Tara"}]}

0 commit comments

Comments
 (0)