Skip to content

Instantly share code, notes, and snippets.

@dhelbegor
Created May 6, 2020 18:49
Show Gist options
  • Save dhelbegor/421a4ac03c4b4de1ed761fb91ba4d294 to your computer and use it in GitHub Desktop.
Save dhelbegor/421a4ac03c4b4de1ed761fb91ba4d294 to your computer and use it in GitHub Desktop.
## utils.py
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
def get_paginator(qs, page_size, page, count, paginated_type, **kwargs):
"""
Method to paginate with some basics parameters in the query.
@page: get current page
@pages: show total of pages
@count: show the total of items in the query
@page_size: the page size param
@has_next: says if have a next page
@has_prev: says if have a prev page
@results: the objects for this pagination
"""
paginator = Paginator(qs, page_size)
try:
page = paginator.page(page)
except PageNotAnInteger:
page = paginator.page(1)
except EmptyPage:
page = paginator.page(paginator.num_pages)
return paginated_type(
page=page.number,
pages=paginator.num_pages,
count=paginator.count,
page_size=paginator.per_page,
has_next=page.has_next(),
has_prev=page.has_previous(),
results=page.object_list,
**kwargs
)
## schema.py
class PostType(DjangoObjectType):
class Meta:
model = Post
interfaces = (graphene.Node, )
class PostPaginatedType(graphene.ObjectType):
page = graphene.Int()
pages = graphene.Int()
count = graphene.Int()
page_size = graphene.Int()
has_next = graphene.Boolean()
has_prev = graphene.Boolean()
results = graphene.List(PostType)
class Query(object):
posts = graphene.Field(
PostPaginatedType,
page=graphene.Int(),
page_size=graphene.Int()
)
def resolve_post(self, info, page=None, page_size=20, count=0, **kws):
qs = Post.objects.all()
return get_paginator(
qs,page_size,page, count, PostPaginatedType)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment