GraphQL Pagination #9714

Closed
opened 2025-12-29 21:21:29 +01:00 by adam · 4 comments
Owner

Originally created by @jepify on GitHub (May 21, 2024).

Originally assigned to: @arthanson on GitHub.

NetBox version

v4.0.2

Feature type

Data model extension

Proposed functionality

Pagination in GraphQL.
With the newly Strawberry.rocks GraphQL engine, it is possible to implement Pagination with a few simple modifications.

GraphQL Pagination
Strawberry Pagination
Strawberry Django offset-based
Strawberry Django cursor-based

Given the different ways of implementing pagination, it should be able to co-exist with non paginated queries, if needed.
This could be done by e.g. keeping the regular e.g. device_list query and a device_connection query.

Use case

With large tables with e.g. interfaces doing queries with nested objects takes a lot of time due to the translation from QuerySets via the Execution of fields part of the spec.

Other forks like Nautobot supports offset-based pagination and the Rest API supports offset-based, so it would be a nice addition to the future use of GraphQL.

Currently if we want to do pagination for GraphQL we are to utilize the ordering and pagination of the Rest API with ordering and id__gtqueries.

The query could be:

query MyQuery {
  device_list(first: 2, after:"YXJyYXljb25uZWN0aW9uOjM=") {
    edges {
      cursor
      node {
        id
        name
      }
    }
    page_info {
      has_next_page
      has_previous_page
      start_cursor
      end_cursor
    }
  }
  device_role_list(pagination: {offset: 2, limit: 2}) {
    name
    id
  }
}

And would result in:

{
  "data": {
    "device_list": {
      "edges": [
        {
          "cursor": "YXJyYXljb25uZWN0aW9uOjQ=",
          "node": {
            "id": "33577",
            "name": "01-02-1 Cable management (U22)"
          }
        },
        {
          "cursor": "YXJyYXljb25uZWN0aW9uOjU=",
          "node": {
            "id": "33576",
            "name": "01-02-1 RJ45 PP (U26)"
          }
        }
      ],
      "page_info": {
        "has_next_page": true,
        "has_previous_page": true,
        "start_cursor": "YXJyYXljb25uZWN0aW9uOjQ=",
        "end_cursor": "YXJyYXljb25uZWN0aW9uOjU="
      }
    },
    "device_role_list": [
      {
        "name": "Access Switch",
        "id": "30"
      },
      {
        "name": "Analyzer",
        "id": "826"
      }
    ]
  }
}

Database changes

None

External dependencies

None

Originally created by @jepify on GitHub (May 21, 2024). Originally assigned to: @arthanson on GitHub. ### NetBox version v4.0.2 ### Feature type Data model extension ### Proposed functionality Pagination in GraphQL. With the newly Strawberry.rocks GraphQL engine, it is possible to implement Pagination with a few simple modifications. [GraphQL Pagination](https://graphql.org/learn/pagination/) [Strawberry Pagination](https://strawberry.rocks/docs/guides/pagination/overview) [Strawberry Django offset-based](https://strawberry-graphql.github.io/strawberry-django/guide/pagination/) [Strawberry Django cursor-based](https://strawberry-graphql.github.io/strawberry-django/guide/relay/) Given the different ways of implementing pagination, it should be able to co-exist with non paginated queries, if needed. This could be done by e.g. keeping the regular e.g. `device_list` query and a `device_connection` query. ### Use case With large tables with e.g. interfaces doing queries with nested objects takes a lot of time due to the translation from QuerySets via the [Execution of fields](https://spec.graphql.org/June2018/#sec-Executing-Fields) part of the spec. Other forks like Nautobot supports offset-based pagination and the Rest API supports offset-based, so it would be a nice addition to the future use of GraphQL. Currently if we want to do pagination for GraphQL we are to utilize the ordering and pagination of the Rest API with `ordering` and `id__gt`queries. The query could be: ``` query MyQuery { device_list(first: 2, after:"YXJyYXljb25uZWN0aW9uOjM=") { edges { cursor node { id name } } page_info { has_next_page has_previous_page start_cursor end_cursor } } device_role_list(pagination: {offset: 2, limit: 2}) { name id } } ``` And would result in: ``` { "data": { "device_list": { "edges": [ { "cursor": "YXJyYXljb25uZWN0aW9uOjQ=", "node": { "id": "33577", "name": "01-02-1 Cable management (U22)" } }, { "cursor": "YXJyYXljb25uZWN0aW9uOjU=", "node": { "id": "33576", "name": "01-02-1 RJ45 PP (U26)" } } ], "page_info": { "has_next_page": true, "has_previous_page": true, "start_cursor": "YXJyYXljb25uZWN0aW9uOjQ=", "end_cursor": "YXJyYXljb25uZWN0aW9uOjU=" } }, "device_role_list": [ { "name": "Access Switch", "id": "30" }, { "name": "Analyzer", "id": "826" } ] } } ``` ### Database changes None ### External dependencies None
adam closed this issue 2025-12-29 21:21:30 +01:00
Author
Owner

@github-actions[bot] commented on GitHub (Aug 20, 2024):

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. NetBox is governed by a small group of core maintainers which means not all opened issues may receive direct feedback. Do not attempt to circumvent this process by "bumping" the issue; doing so will result in its immediate closure and you may be barred from participating in any future discussions. Please see our contributing guide.

@github-actions[bot] commented on GitHub (Aug 20, 2024): This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. NetBox is governed by a small group of core maintainers which means not all opened issues may receive direct feedback. **Do not** attempt to circumvent this process by "bumping" the issue; doing so will result in its immediate closure and you may be barred from participating in any future discussions. Please see our [contributing guide](https://github.com/netbox-community/netbox/blob/develop/CONTRIBUTING.md).
Author
Owner

@jeremypng commented on GitHub (Jan 23, 2025):

If we can get my PR in for the GraphQL filtering redesign, I'll add this feature as well.

@jeremypng commented on GitHub (Jan 23, 2025): If we can get my PR in for the GraphQL filtering redesign, I'll add this feature as well.
Author
Owner

@tyler-8 commented on GitHub (Feb 11, 2025):

Just want to add my support for this feature. Without pagination I end up having to use more inefficient workarounds (querying devices by regions, or arbitrary groupings of sites) which add unnecessary complexity for what is ultimately trying to have pagination-like behavior without pagination.

Throw in various bits of nested relationship data and complexity is tough to manage. Pagination would significantly improve the experience and simplicity of API workflows.

@tyler-8 commented on GitHub (Feb 11, 2025): Just want to add my support for this feature. Without pagination I end up having to use more inefficient workarounds (querying devices by regions, or arbitrary groupings of sites) which add unnecessary complexity for what is ultimately trying to have pagination-like behavior without pagination. Throw in various bits of nested relationship data and complexity is tough to manage. Pagination would significantly improve the experience and simplicity of API workflows.
Author
Owner

@jeremystretch commented on GitHub (Mar 13, 2025):

Note: When this is implemented, we'll need to ensure we don't introduce the bug cited in #18729, which results from non-deterministic ordering of a queryset.

@jeremystretch commented on GitHub (Mar 13, 2025): Note: When this is implemented, we'll need to ensure we don't introduce the bug cited in #18729, which results from non-deterministic ordering of a queryset.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/netbox#9714