如何迭代 Python SDK for Microsoft Graph 中的分页结果?

scu*_*bbo 2 python microsoft-graph-sdks microsoft-graph-api

我正在掌握Python SDK,之前从未使用过 GraphQL (但我熟悉基本概念)。我能够odata_next_link从响应中检索值,但我不确定如何使用它。我从这里注意到:

您应该在下一页结果的请求中的 @odata.nextLink 属性中包含整个 URL。根据执行查询的 API,@odata.nextLink URL 值将包含 $skiptoken 或 $skip 查询参数。URL 还包含原始请求中存在的所有其他查询参数。不要尝试提取 $skiptoken 或 $skip 值并将其用于不同的请求。

但是,我不确定如何在下一个请求中包含该 URL。目前,我的查询看起来像response = await graph_client.groups.by_group_id(group_id).transitive_members.get()- 我没有看到更改基本网址的选项。我想我可以做这样的事情:

query_params = GroupsRequestBuilder.GroupsRequestBuilderGetQueryParameters(
  skip_token = parse_qs(urlparse(response.odata_next_link).query)['$skipToken'][0]
)
request_configuration = GroupsRequestBuilder.GroupsRequestBuilderGetRequestConfiguration(
  query_parameters=query_params
)
response = await graph_client.[...].get(request_configuration)
Run Code Online (Sandbox Code Playgroud)

但该报告GroupsRequestBuilder.GroupsRequestBuilderGetQueryParameters.__init__() got an unexpected keyword argument 'skip_token'(如果我尝试命名参数skiptoken或,则类似skipToken

令人沮丧的是,这里没有代码示例- 但是,基于这些示例,我确实在存储库中搜索了迭代器 -但没有结果

小智 7

我们还没有适用于 Python SDK 的页面迭代器,但是增加了对使用请求的原始 url 的支持。在分页的情况下,用户可以使用odata_next_link属性值使用with_url发出新请求并获取下一页中的项目。

这是一个工作示例:


from msgraph.generated.users.users_request_builder import UsersRequestBuilder

async def get_users():

    query_params = UsersRequestBuilder.UsersRequestBuilderGetQueryParameters(

    select=["id", "displayName", "createdDateTime"],

    top=5,

    )

    request_config = UsersRequestBuilder.UsersRequestBuilderGetRequestConfiguration(

        query_parameters=query_params

    )

    users_list = []

    users = await client.users.get(request_configuration=request_config)

    for user in users.value:

        users_list.append(user)

    next_link = users.odata_next_link

    while next_link:

        users = await client.users.with_url(next_link).get()

        next_link = users.odata_next_link

        for user in users.value:

            users_list.append(user)

    print(len(users_list))

Run Code Online (Sandbox Code Playgroud)