Pagination 在graphene relay.ConnectionField中强制分页

Pagination 在graphene relay.ConnectionField中强制分页,pagination,graphene-python,Pagination,Graphene Python,graphene附带的relay.ConnectionField实现默认情况下不会对查询进行分页。(可以选择使用“first”或“last”对连接进行分页。)如果连接具有大量节点,则这是不实际的。强制分页(例如一次不超过100个节点)的适当方式是什么 不幸的是,石墨烯不支持默认值。我为这种箱子做了一个装饰工。适当设置默认页面大小和最大页面大小。可以进行调整以从装饰器本身接收这些值,但我将其与Django和ergo Django的设置一起使用 DEFAULT_PAGE_SIZE = 10 MAX_

graphene附带的
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")