Skip to content

Commit e666d84

Browse files
authored
Merge pull request #315 from BossGrand/fix/django_filter_connection_field_merge_queries
Fix Bug causing DjangoFilterConnectionField to ignore annotations, .reverse()
2 parents ec2cea1 + 4013f78 commit e666d84

File tree

2 files changed

+138
-2
lines changed

2 files changed

+138
-2
lines changed

graphene_django/filter/fields.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def merge_querysets(default_queryset, queryset):
6161
low = default_queryset.query.low_mark or queryset.query.low_mark
6262
high = default_queryset.query.high_mark or queryset.query.high_mark
6363
default_queryset.query.clear_limits()
64-
queryset = default_queryset & queryset
64+
queryset = queryset & default_queryset
6565
queryset.query.set_limits(low, high)
6666
return queryset
6767

graphene_django/filter/tests/test_fields.py

Lines changed: 137 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@
22

33
import pytest
44

5-
from graphene import Field, ObjectType, Schema, Argument, Float
5+
from graphene import Field, ObjectType, Schema, Argument, Float, Boolean, String
66
from graphene.relay import Node
77
from graphene_django import DjangoObjectType
88
from graphene_django.forms import (GlobalIDFormField,
99
GlobalIDMultipleChoiceField)
1010
from graphene_django.tests.models import Article, Pet, Reporter
1111
from graphene_django.utils import DJANGO_FILTER_INSTALLED
1212

13+
# for annotation test
14+
from django.db.models import TextField, Value
15+
from django.db.models.functions import Concat
16+
1317
pytestmark = []
1418

1519
if DJANGO_FILTER_INSTALLED:
@@ -534,3 +538,135 @@ def resolve_all_reporters(self, info, **args):
534538
assert str(result.errors[0]) == (
535539
'Received two sliced querysets (high mark) in the connection, please slice only in one.'
536540
)
541+
542+
def test_order_by_is_perserved():
543+
class ReporterType(DjangoObjectType):
544+
class Meta:
545+
model = Reporter
546+
interfaces = (Node, )
547+
filter_fields = ()
548+
549+
class Query(ObjectType):
550+
all_reporters = DjangoFilterConnectionField(ReporterType, reverse_order=Boolean())
551+
552+
def resolve_all_reporters(self, info, reverse_order=False, **args):
553+
reporters = Reporter.objects.order_by('first_name')
554+
555+
if reverse_order:
556+
return reporters.reverse()
557+
558+
return reporters
559+
560+
Reporter.objects.create(
561+
first_name='b',
562+
)
563+
r = Reporter.objects.create(
564+
first_name='a',
565+
)
566+
567+
schema = Schema(query=Query)
568+
query = '''
569+
query NodeFilteringQuery {
570+
allReporters(first: 1) {
571+
edges {
572+
node {
573+
firstName
574+
}
575+
}
576+
}
577+
}
578+
'''
579+
expected = {
580+
'allReporters': {
581+
'edges': [{
582+
'node': {
583+
'firstName': 'a',
584+
}
585+
}]
586+
}
587+
}
588+
589+
result = schema.execute(query)
590+
assert not result.errors
591+
assert result.data == expected
592+
593+
594+
reverse_query = '''
595+
query NodeFilteringQuery {
596+
allReporters(first: 1, reverseOrder: true) {
597+
edges {
598+
node {
599+
firstName
600+
}
601+
}
602+
}
603+
}
604+
'''
605+
606+
reverse_expected = {
607+
'allReporters': {
608+
'edges': [{
609+
'node': {
610+
'firstName': 'b',
611+
}
612+
}]
613+
}
614+
}
615+
616+
reverse_result = schema.execute(reverse_query)
617+
618+
assert not reverse_result.errors
619+
assert reverse_result.data == reverse_expected
620+
621+
def test_annotation_is_perserved():
622+
class ReporterType(DjangoObjectType):
623+
full_name = String()
624+
625+
def resolve_full_name(instance, info, **args):
626+
return instance.full_name
627+
628+
class Meta:
629+
model = Reporter
630+
interfaces = (Node, )
631+
filter_fields = ()
632+
633+
class Query(ObjectType):
634+
all_reporters = DjangoFilterConnectionField(ReporterType)
635+
636+
def resolve_all_reporters(self, info, **args):
637+
return Reporter.objects.annotate(
638+
full_name=Concat('first_name', Value(' '), 'last_name', output_field=TextField())
639+
)
640+
641+
Reporter.objects.create(
642+
first_name='John',
643+
last_name='Doe',
644+
)
645+
646+
schema = Schema(query=Query)
647+
648+
query = '''
649+
query NodeFilteringQuery {
650+
allReporters(first: 1) {
651+
edges {
652+
node {
653+
fullName
654+
}
655+
}
656+
}
657+
}
658+
'''
659+
expected = {
660+
'allReporters': {
661+
'edges': [{
662+
'node': {
663+
'fullName': 'John Doe',
664+
}
665+
}]
666+
}
667+
}
668+
669+
result = schema.execute(query)
670+
671+
assert not result.errors
672+
assert result.data == expected

0 commit comments

Comments
 (0)