Skip to content

Commit a51c2bf

Browse files
authored
Allow to use camel case in order by field (#1054)
Fixes #1008
1 parent 0e12343 commit a51c2bf

File tree

3 files changed

+80
-3
lines changed

3 files changed

+80
-3
lines changed

graphene_django/filter/fields.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from django.core.exceptions import ValidationError
55
from graphene.types.argument import to_arguments
6+
from graphene.utils.str_converters import to_snake_case
67
from ..fields import DjangoConnectionField
78
from .utils import get_filtering_args_from_filterset, get_filterset_class
89

@@ -61,12 +62,21 @@ def filtering_args(self):
6162
def resolve_queryset(
6263
cls, connection, iterable, info, args, filtering_args, filterset_class
6364
):
65+
def filter_kwargs():
66+
kwargs = {}
67+
for k, v in args.items():
68+
if k in filtering_args:
69+
if k == "order_by":
70+
v = to_snake_case(v)
71+
kwargs[k] = v
72+
return kwargs
73+
6474
qs = super(DjangoFilterConnectionField, cls).resolve_queryset(
6575
connection, iterable, info, args
6676
)
67-
filter_kwargs = {k: v for k, v in args.items() if k in filtering_args}
77+
6878
filterset = filterset_class(
69-
data=filter_kwargs, queryset=qs, request=info.context
79+
data=filter_kwargs(), queryset=qs, request=info.context
7080
)
7181
if filterset.form.is_valid():
7282
return filterset.qs

graphene_django/filter/tests/filters.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class Meta:
2121
model = Reporter
2222
fields = ["first_name", "last_name", "email", "pets"]
2323

24-
order_by = OrderingFilter(fields=("pub_date",))
24+
order_by = OrderingFilter(fields=("first_name",))
2525

2626

2727
class PetFilter(django_filters.FilterSet):

graphene_django/filter/tests/test_fields.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -713,6 +713,73 @@ def resolve_all_reporters(self, info, **args):
713713
assert result.data == expected
714714

715715

716+
def test_order_by():
717+
class ReporterType(DjangoObjectType):
718+
class Meta:
719+
model = Reporter
720+
interfaces = (Node,)
721+
722+
class Query(ObjectType):
723+
all_reporters = DjangoFilterConnectionField(
724+
ReporterType, filterset_class=ReporterFilter
725+
)
726+
727+
Reporter.objects.create(first_name="b")
728+
Reporter.objects.create(first_name="a")
729+
730+
schema = Schema(query=Query)
731+
query = """
732+
query NodeFilteringQuery {
733+
allReporters(orderBy: "-firstName") {
734+
edges {
735+
node {
736+
firstName
737+
}
738+
}
739+
}
740+
}
741+
"""
742+
expected = {
743+
"allReporters": {
744+
"edges": [{"node": {"firstName": "b"}}, {"node": {"firstName": "a"}}]
745+
}
746+
}
747+
748+
result = schema.execute(query)
749+
assert not result.errors
750+
assert result.data == expected
751+
752+
query = """
753+
query NodeFilteringQuery {
754+
allReporters(orderBy: "-first_name") {
755+
edges {
756+
node {
757+
firstName
758+
}
759+
}
760+
}
761+
}
762+
"""
763+
764+
result = schema.execute(query)
765+
assert not result.errors
766+
assert result.data == expected
767+
768+
query = """
769+
query NodeFilteringQuery {
770+
allReporters(orderBy: "-firtsnaMe") {
771+
edges {
772+
node {
773+
firstName
774+
}
775+
}
776+
}
777+
}
778+
"""
779+
result = schema.execute(query)
780+
assert result.errors
781+
782+
716783
def test_order_by_is_perserved():
717784
class ReporterType(DjangoObjectType):
718785
class Meta:

0 commit comments

Comments
 (0)