基于Graphene-Django中继光标的分页不适用于动态数据

时间:2019-08-12 04:59:03

标签: django relayjs relay graphene-python graphene-django

我正在使用Graphene-Django Relay规范获取动态数据。

import graphene
from graphene_django.types import DjangoObjectType
from graphene_django.fields import DjangoConnectionField

from . import models


class PostType(DjangoObjectType):
    class Meta:
        model = models.Post
        interfaces = (graphene.Node, )

class Query(graphene.ObjectType):
    post = graphene.Field(PostType)
    posts = DjangoConnectionField(PostType)

def resolve_posts(self, info, **kwargs):
    return models.Post.objects.order_by('-score', '-id')

在获取游标和数据后添加新帖子时,游标会更改。换句话说,指向数据的确切偏移量的游标不再指向该数据。它指向一个新的不同数据。因此,我无法通过使用以下方式实现基于游标的分页:

query fetchPosts ($cursor) {
    posts(first: 20, after: $cursor)...
}

由于光标随数据的变化而变化,因此与传统的基于偏移的分页没有什么不同。我有什么想念的吗?我想要的光标是不会更改。喜欢这篇文章:

https://www.sitepoint.com/paginating-real-time-data-cursor-based-pagination/

如何使光标指向动态变化的相同数据?

1 个答案:

答案 0 :(得分:0)

不幸的是,我认为这种行为是可以预期的。中继的策略比传统的偏移分页更灵活,但是有相同的局限性。

如果基础数据发生变化,那么代表它的分页也将需要更改。

如果您想避免这种情况,可以考虑以其他方式对基础数据进行排序,以使新记录不会改变您的分页。例如,如果按创建时间对帖子进行排序,则新帖子将添加到列表的末尾,并且您以前的所有分页仍然有效。