Pagination 在graphene relay.ConnectionField中强制分页
graphene附带的Pagination 在graphene relay.ConnectionField中强制分页,pagination,graphene-python,Pagination,Graphene Python,graphene附带的relay.ConnectionField实现默认情况下不会对查询进行分页。(可以选择使用“first”或“last”对连接进行分页。)如果连接具有大量节点,则这是不实际的。强制分页(例如一次不超过100个节点)的适当方式是什么 不幸的是,石墨烯不支持默认值。我为这种箱子做了一个装饰工。适当设置默认页面大小和最大页面大小。可以进行调整以从装饰器本身接收这些值,但我将其与Django和ergo Django的设置一起使用 DEFAULT_PAGE_SIZE = 10 MAX_
relay.ConnectionField
实现默认情况下不会对查询进行分页。(可以选择使用“first”或“last”对连接进行分页。)如果连接具有大量节点,则这是不实际的。强制分页(例如一次不超过100个节点)的适当方式是什么 不幸的是,石墨烯不支持默认值。我为这种箱子做了一个装饰工。适当设置默认页面大小
和最大页面大小
。可以进行调整以从装饰器本身接收这些值,但我将其与Django和ergo Django的设置一起使用
DEFAULT_PAGE_SIZE = 10
MAX_PAGE_SIZE = 100
def limited_pagination(func):
'''
Decorator for limiting the `first` and `last` pagination parameters. Uses
DEFAULT_PAGE_SIZE and MAX_PAGE_SIZE settings. Raises an exception when
values are invalid.
'''
def wrapper(*args, **kwargs):
if 'first' in kwargs and 'last' in kwargs:
raise RuntimeError('Use either `first` or `last`, not both.')
for key in ('first', 'last'):
if key in kwargs:
try:
value = int(kwargs[key])
except ValueError:
raise ValueError('`{}` must be an integer.'.format(key))
if value < 0:
raise ValueError('`{}` must be 0 or greater.'.format(key))
elif value > MAX_PAGE_SIZE:
raise ValueError(
'`{}` must not be greater than {}.'.format(
key, MAX_PAGE_SIZE
)
)
kwargs[key] = value
break # Break out of for loop to skip `else` branch.
else:
kwargs['first'] = DEFAULT_PAGE_SIZE
result = func(*args, **kwargs)
return result
return wrapper
对于那些寻找django解决方案的人,graphene django具有
中继连接\u强制执行\u FIRST\u或\u LAST
和中继连接\u MAX\u LIMIT
设置:。您只需启用RELAY\u CONNECTION\u efforce\u FIRST\u或\u LAST
,并确保在查询声明中使用djangconnectionfield
例如:
# settings
GRAPHENE = {
'RELAY_CONNECTION_ENFORCE_FIRST_OR_LAST': True,
'RELAY_CONNECTION_MAX_LIMIT': 50,
}
# model
class Category(models.Model):
name = models.CharField(max_length=100)
# graphql type
class CategoryType(graphene_django.DjangoObjectType):
class Meta:
model = Category
fields = ("id", 'name')
interfaces = (graphene.relay.Node,)
# query
class Query(graphene.ObjectType):
categories = graphene_django.DjangoConnectionField(CategoryType)
def resolve_categories(root, info, **kwargs):
return Category.objects.all().order_by("id")
什么意思?你想问下两个问题吗?谢谢。对于像SQLAlchemy连接这样的连接,您有什么建议吗?通常,您根本不需要为连接/外键定义resolve_*函数,事实上这样做相当麻烦。
# settings
GRAPHENE = {
'RELAY_CONNECTION_ENFORCE_FIRST_OR_LAST': True,
'RELAY_CONNECTION_MAX_LIMIT': 50,
}
# model
class Category(models.Model):
name = models.CharField(max_length=100)
# graphql type
class CategoryType(graphene_django.DjangoObjectType):
class Meta:
model = Category
fields = ("id", 'name')
interfaces = (graphene.relay.Node,)
# query
class Query(graphene.ObjectType):
categories = graphene_django.DjangoConnectionField(CategoryType)
def resolve_categories(root, info, **kwargs):
return Category.objects.all().order_by("id")