3939 find_skip_and_limit ,
4040 get_model_reference_fields ,
4141 get_query_fields ,
42+ has_page_info ,
4243)
4344
4445PYMONGO_VERSION = tuple (pymongo .version_tuple [:2 ])
@@ -276,7 +277,7 @@ def fields(self):
276277 return self ._type ._meta .fields
277278
278279 def get_queryset (
279- self , model , info , required_fields = None , skip = None , limit = None , reversed = False , ** args
280+ self , model , info , required_fields = None , skip = None , limit = None , ** args
280281 ) -> QuerySet :
281282 if required_fields is None :
282283 required_fields = list ()
@@ -325,49 +326,22 @@ def get_queryset(
325326 else :
326327 args .update (queryset_or_filters )
327328 if limit is not None :
328- if reversed :
329- if self .order_by :
330- order_by = self .order_by + ",-pk"
331- else :
332- order_by = "-pk"
333- return (
334- model .objects (** args )
335- .no_dereference ()
336- .only (* required_fields )
337- .order_by (order_by )
338- .skip (skip if skip else 0 )
339- .limit (limit )
340- )
341- else :
342- return (
343- model .objects (** args )
344- .no_dereference ()
345- .only (* required_fields )
346- .order_by (self .order_by )
347- .skip (skip if skip else 0 )
348- .limit (limit )
349- )
329+ return (
330+ model .objects (** args )
331+ .no_dereference ()
332+ .only (* required_fields )
333+ .order_by (self .order_by )
334+ .skip (skip if skip else 0 )
335+ .limit (limit )
336+ )
350337 elif skip is not None :
351- if reversed :
352- if self .order_by :
353- order_by = self .order_by + ",-pk"
354- else :
355- order_by = "-pk"
356- return (
357- model .objects (** args )
358- .no_dereference ()
359- .only (* required_fields )
360- .order_by (order_by )
361- .skip (skip )
362- )
363- else :
364- return (
365- model .objects (** args )
366- .no_dereference ()
367- .only (* required_fields )
368- .order_by (self .order_by )
369- .skip (skip )
370- )
338+ return (
339+ model .objects (** args )
340+ .no_dereference ()
341+ .only (* required_fields )
342+ .order_by (self .order_by )
343+ .skip (skip )
344+ )
371345 return model .objects (** args ).no_dereference ().only (* required_fields ).order_by (self .order_by )
372346
373347 def default_resolver (self , _root , info , required_fields = None , resolved = None , ** args ):
@@ -401,7 +375,6 @@ def default_resolver(self, _root, info, required_fields=None, resolved=None, **a
401375 skip = 0
402376 count = 0
403377 limit = None
404- reverse = False
405378 first = args .pop ("first" , None )
406379 after = args .pop ("after" , None )
407380 if after :
@@ -410,14 +383,15 @@ def default_resolver(self, _root, info, required_fields=None, resolved=None, **a
410383 before = args .pop ("before" , None )
411384 if before :
412385 before = cursor_to_offset (before )
386+ requires_page_info = has_page_info (info )
413387 has_next_page = False
414388
415389 if resolved is not None :
416390 items = resolved
417391
418392 if isinstance (items , QuerySet ):
419393 try :
420- if last is not None and after is not None :
394+ if last is not None :
421395 count = items .count (with_limit_and_skip = False )
422396 else :
423397 count = None
@@ -426,29 +400,24 @@ def default_resolver(self, _root, info, required_fields=None, resolved=None, **a
426400 else :
427401 count = len (items )
428402
429- skip , limit , reverse = find_skip_and_limit (
403+ skip , limit = find_skip_and_limit (
430404 first = first , last = last , after = after , before = before , count = count
431405 )
432406
433407 if isinstance (items , QuerySet ):
434408 if limit :
435- _base_query : QuerySet = (
436- items .order_by ("-pk" ).skip (skip ) if reverse else items .skip (skip )
437- )
409+ _base_query : QuerySet = items .skip (skip )
438410 items = _base_query .limit (limit )
439- has_next_page = len (_base_query .skip (limit ).only ("id" ).limit (1 )) != 0
411+ has_next_page = len (_base_query .skip (skip + limit ).only ("id" ).limit (1 )) != 0
440412 elif skip :
441413 items = items .skip (skip )
442414 else :
443415 if limit :
444- if reverse :
445- _base_query = items [::- 1 ]
446- items = _base_query [skip : skip + limit ]
447- has_next_page = (skip + limit ) < len (_base_query )
448- else :
449- _base_query = items
450- items = items [skip : skip + limit ]
451- has_next_page = (skip + limit ) < len (_base_query )
416+ _base_query = items
417+ items = items [skip : skip + limit ]
418+ has_next_page = (
419+ (skip + limit ) < len (_base_query ) if requires_page_info else False
420+ )
452421 elif skip :
453422 items = items [skip :]
454423 iterables = list (items )
@@ -503,11 +472,11 @@ def default_resolver(self, _root, info, required_fields=None, resolved=None, **a
503472 else :
504473 count = self .model .objects (args_copy ).count ()
505474 if count != 0 :
506- skip , limit , reverse = find_skip_and_limit (
475+ skip , limit = find_skip_and_limit (
507476 first = first , after = after , last = last , before = before , count = count
508477 )
509478 iterables = self .get_queryset (
510- self .model , info , required_fields , skip , limit , reverse , ** args
479+ self .model , info , required_fields , skip , limit , ** args
511480 )
512481 list_length = len (iterables )
513482 if isinstance (info , GraphQLResolveInfo ):
@@ -519,14 +488,11 @@ def default_resolver(self, _root, info, required_fields=None, resolved=None, **a
519488
520489 elif "pk__in" in args and args ["pk__in" ]:
521490 count = len (args ["pk__in" ])
522- skip , limit , reverse = find_skip_and_limit (
491+ skip , limit = find_skip_and_limit (
523492 first = first , last = last , after = after , before = before , count = count
524493 )
525494 if limit :
526- if reverse :
527- args ["pk__in" ] = args ["pk__in" ][::- 1 ][skip : skip + limit ]
528- else :
529- args ["pk__in" ] = args ["pk__in" ][skip : skip + limit ]
495+ args ["pk__in" ] = args ["pk__in" ][skip : skip + limit ]
530496 elif skip :
531497 args ["pk__in" ] = args ["pk__in" ][skip :]
532498 iterables = self .get_queryset (self .model , info , required_fields , ** args )
@@ -542,18 +508,13 @@ def default_resolver(self, _root, info, required_fields=None, resolved=None, **a
542508 field_name = to_snake_case (info .field_name )
543509 items = getattr (_root , field_name , [])
544510 count = len (items )
545- skip , limit , reverse = find_skip_and_limit (
511+ skip , limit = find_skip_and_limit (
546512 first = first , last = last , after = after , before = before , count = count
547513 )
548514 if limit :
549- if reverse :
550- _base_query = items [::- 1 ]
551- items = _base_query [skip : skip + limit ]
552- has_next_page = (skip + limit ) < len (_base_query )
553- else :
554- _base_query = items
555- items = items [skip : skip + limit ]
556- has_next_page = (skip + limit ) < len (_base_query )
515+ _base_query = items
516+ items = items [skip : skip + limit ]
517+ has_next_page = (skip + limit ) < len (_base_query ) if requires_page_info else False
557518 elif skip :
558519 items = items [skip :]
559520 iterables = items
@@ -567,11 +528,6 @@ def default_resolver(self, _root, info, required_fields=None, resolved=None, **a
567528 )
568529 has_previous_page = True if skip else False
569530
570- if reverse :
571- iterables = list (iterables )
572- iterables .reverse ()
573- skip = limit
574-
575531 connection = connection_from_iterables (
576532 edges = iterables ,
577533 start_offset = skip ,
0 commit comments