Skip to content

Commit 51d2020

Browse files
committed
Fix filtering with GlobalIDFilter
1 parent b1f6d41 commit 51d2020

File tree

2 files changed

+115
-1
lines changed

2 files changed

+115
-1
lines changed

graphene_django/filter/fields.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from collections import OrderedDict
22
from functools import partial
33

4+
from django.core.exceptions import ValidationError
45
from graphene.types.argument import to_arguments
56
from ..fields import DjangoConnectionField
67
from .utils import get_filtering_args_from_filterset, get_filterset_class
@@ -59,7 +60,12 @@ def resolve_queryset(
5960
connection, iterable, info, args
6061
)
6162
filter_kwargs = {k: v for k, v in args.items() if k in filtering_args}
62-
return filterset_class(data=filter_kwargs, queryset=qs, request=info.context).qs
63+
filterset = filterset_class(
64+
data=filter_kwargs, queryset=qs, request=info.context
65+
)
66+
if filterset.is_valid():
67+
return filterset.qs
68+
raise ValidationError(filterset.errors.as_json())
6369

6470
def get_queryset_resolver(self):
6571
return partial(

graphene_django/filter/tests/test_fields.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,114 @@ def test_global_id_field_relation():
400400
assert id_filter.field_class == GlobalIDFormField
401401

402402

403+
def test_global_id_field_relation_with_filter():
404+
class ReporterFilterNode(DjangoObjectType):
405+
class Meta:
406+
model = Reporter
407+
interfaces = (Node,)
408+
filter_fields = ["first_name", "articles"]
409+
410+
class ArticleFilterNode(DjangoObjectType):
411+
class Meta:
412+
model = Article
413+
interfaces = (Node,)
414+
filter_fields = ["headline", "reporter"]
415+
416+
class Query(ObjectType):
417+
all_reporters = DjangoFilterConnectionField(ReporterFilterNode)
418+
all_articles = DjangoFilterConnectionField(ArticleFilterNode)
419+
reporter = Field(ReporterFilterNode)
420+
article = Field(ArticleFilterNode)
421+
422+
r1 = Reporter.objects.create(first_name="r1", last_name="r1", email="r1@test.com")
423+
r2 = Reporter.objects.create(first_name="r2", last_name="r2", email="r2@test.com")
424+
Article.objects.create(
425+
headline="a1",
426+
pub_date=datetime.now(),
427+
pub_date_time=datetime.now(),
428+
reporter=r1,
429+
editor=r1,
430+
)
431+
Article.objects.create(
432+
headline="a2",
433+
pub_date=datetime.now(),
434+
pub_date_time=datetime.now(),
435+
reporter=r2,
436+
editor=r2,
437+
)
438+
439+
# Query articles created by the reporter `r1`
440+
query = """
441+
query {
442+
allArticles (reporter: "UmVwb3J0ZXJGaWx0ZXJOb2RlOjE=") {
443+
edges {
444+
node {
445+
id
446+
}
447+
}
448+
}
449+
}
450+
"""
451+
schema = Schema(query=Query)
452+
result = schema.execute(query)
453+
assert not result.errors
454+
# We should only get back a single article
455+
assert len(result.data["allArticles"]["edges"]) == 1
456+
457+
458+
def test_global_id_field_relation_with_filter_not_valid_id():
459+
class ReporterFilterNode(DjangoObjectType):
460+
class Meta:
461+
model = Reporter
462+
interfaces = (Node,)
463+
filter_fields = ["first_name", "articles"]
464+
465+
class ArticleFilterNode(DjangoObjectType):
466+
class Meta:
467+
model = Article
468+
interfaces = (Node,)
469+
filter_fields = ["headline", "reporter"]
470+
471+
class Query(ObjectType):
472+
all_reporters = DjangoFilterConnectionField(ReporterFilterNode)
473+
all_articles = DjangoFilterConnectionField(ArticleFilterNode)
474+
reporter = Field(ReporterFilterNode)
475+
article = Field(ArticleFilterNode)
476+
477+
r1 = Reporter.objects.create(first_name="r1", last_name="r1", email="r1@test.com")
478+
r2 = Reporter.objects.create(first_name="r2", last_name="r2", email="r2@test.com")
479+
Article.objects.create(
480+
headline="a1",
481+
pub_date=datetime.now(),
482+
pub_date_time=datetime.now(),
483+
reporter=r1,
484+
editor=r1,
485+
)
486+
Article.objects.create(
487+
headline="a2",
488+
pub_date=datetime.now(),
489+
pub_date_time=datetime.now(),
490+
reporter=r2,
491+
editor=r2,
492+
)
493+
494+
# Filter by the global ID that does not exist
495+
query = """
496+
query {
497+
allArticles (reporter: "fake_global_id") {
498+
edges {
499+
node {
500+
id
501+
}
502+
}
503+
}
504+
}
505+
"""
506+
schema = Schema(query=Query)
507+
result = schema.execute(query)
508+
assert "Invalid ID specified." in result.errors[0].message
509+
510+
403511
def test_global_id_multiple_field_implicit():
404512
field = DjangoFilterConnectionField(ReporterNode, fields=["pets"])
405513
filterset_class = field.filterset_class

0 commit comments

Comments
 (0)