Skip to content

Commit 1cb7fc6

Browse files
committed
Fix pagination using 'after'
1 parent 6bc0f6d commit 1cb7fc6

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

graphene_django/fields.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
import six
44
from django.db.models.query import QuerySet
5-
from graphql_relay.connection.arrayconnection import connection_from_list_slice
5+
from graphql_relay.connection.arrayconnection import (
6+
connection_from_list_slice,
7+
get_offset_with_default,
8+
)
69
from promise import Promise
710

811
from graphene import NonNull
@@ -137,6 +140,9 @@ def resolve_connection(cls, connection, args, iterable, max_limit=None):
137140
list_length = len(iterable)
138141
list_slice_length = max_limit or list_length
139142

143+
after = get_offset_with_default(args.get("after"), -1) + 1
144+
list_slice_length += after
145+
140146
connection = connection_from_list_slice(
141147
iterable,
142148
args,

graphene_django/tests/test_query.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,6 +1130,7 @@ def test_should_have_next_page(graphene_settings):
11301130
graphene_settings.RELAY_CONNECTION_MAX_LIMIT = 4
11311131
reporters = [Reporter(**kwargs) for kwargs in REPORTERS]
11321132
Reporter.objects.bulk_create(reporters)
1133+
db_reporters = Reporter.objects.all()
11331134

11341135
class ReporterType(DjangoObjectType):
11351136
class Meta:
@@ -1144,10 +1145,11 @@ class Query(graphene.ObjectType):
11441145
# See `arrayconnection.py::connection_from_list_slice`:
11451146
# has_next_page=isinstance(first, int) and end_offset < upper_bound
11461147
query = """
1147-
query AllReporters {
1148-
allReporters(first: 4) {
1148+
query AllReporters($first: Int, $after: String) {
1149+
allReporters(first: $first, after: $after) {
11491150
pageInfo {
11501151
hasNextPage
1152+
endCursor
11511153
}
11521154
edges {
11531155
node {
@@ -1158,11 +1160,26 @@ class Query(graphene.ObjectType):
11581160
}
11591161
"""
11601162

1161-
result = schema.execute(query)
1163+
result = schema.execute(query, variable_values=dict(first=4))
11621164
assert not result.errors
11631165
assert len(result.data["allReporters"]["edges"]) == 4
11641166
assert result.data["allReporters"]["pageInfo"]["hasNextPage"]
11651167

1168+
last_result = result.data["allReporters"]["pageInfo"]["endCursor"]
1169+
result2 = schema.execute(query, variable_values=dict(first=4, after=last_result))
1170+
assert not result2.errors
1171+
assert len(result2.data["allReporters"]["edges"]) == 2
1172+
assert not result2.data["allReporters"]["pageInfo"]["hasNextPage"]
1173+
gql_reporters = result.data["allReporters"]["edges"] + result2.data["allReporters"]["edges"]
1174+
1175+
assert {
1176+
to_global_id("ReporterType", reporter.id)
1177+
for reporter in db_reporters
1178+
} == {
1179+
gql_reporter["node"]["id"]
1180+
for gql_reporter in gql_reporters
1181+
}
1182+
11661183

11671184
def test_should_preserve_prefetch_related(django_assert_num_queries):
11681185
class ReporterType(DjangoObjectType):

0 commit comments

Comments
 (0)