mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
GraphQL attribute types are inconsistent and documentation is incorrect #7497
Closed
opened 2025-12-29 20:24:14 +01:00 by adam
·
16 comments
No Branch/Tag Specified
main
update-changelog-comments-docs
feature-removal-issue-type
20911-dropdown
20239-plugin-menu-classes-mutable-state
21097-graphql-id-lookups
feature
fix_module_substitution
20923-dcim-templates
20044-elevation-stuck-lightmode
feature-ip-prefix-link
v4.5-beta1-release
20068-import-moduletype-attrs
20766-fix-german-translation-code-literals
20378-del-script
7604-filter-modifiers-v3
circuit-swap
12318-case-insensitive-uniqueness
20637-improve-device-q-filter
20660-script-load
19724-graphql
20614-update-ruff
14884-script
02496-max-page
19720-macaddress-interface-generic-relation
19408-circuit-terminations-export-templates
20203-openapi-check
fix-19669-api-image-download
7604-filter-modifiers
19275-fixes-interface-bulk-edit
fix-17794-get_field_value_return_list
11507-show-aggregate-and-rir-on-api
9583-add_column_specific_search_field_to_tables
v4.5.0
v4.4.10
v4.4.9
v4.5.0-beta1
v4.4.8
v4.4.7
v4.4.6
v4.4.5
v4.4.4
v4.4.3
v4.4.2
v4.4.1
v4.4.0
v4.3.7
v4.4.0-beta1
v4.3.6
v4.3.5
v4.3.4
v4.3.3
v4.3.2
v4.3.1
v4.3.0
v4.2.9
v4.3.0-beta2
v4.2.8
v4.3.0-beta1
v4.2.7
v4.2.6
v4.2.5
v4.2.4
v4.2.3
v4.2.2
v4.2.1
v4.2.0
v4.1.11
v4.1.10
v4.1.9
v4.1.8
v4.2-beta1
v4.1.7
v4.1.6
v4.1.5
v4.1.4
v4.1.3
v4.1.2
v4.1.1
v4.1.0
v4.0.11
v4.0.10
v4.0.9
v4.1-beta1
v4.0.8
v4.0.7
v4.0.6
v4.0.5
v4.0.3
v4.0.2
v4.0.1
v4.0.0
v3.7.8
v3.7.7
v4.0-beta2
v3.7.6
v3.7.5
v4.0-beta1
v3.7.4
v3.7.3
v3.7.2
v3.7.1
v3.7.0
v3.6.9
v3.6.8
v3.6.7
v3.7-beta1
v3.6.6
v3.6.5
v3.6.4
v3.6.3
v3.6.2
v3.6.1
v3.6.0
v3.5.9
v3.6-beta2
v3.5.8
v3.6-beta1
v3.5.7
v3.5.6
v3.5.5
v3.5.4
v3.5.3
v3.5.2
v3.5.1
v3.5.0
v3.4.10
v3.4.9
v3.5-beta2
v3.4.8
v3.5-beta1
v3.4.7
v3.4.6
v3.4.5
v3.4.4
v3.4.3
v3.4.2
v3.4.1
v3.4.0
v3.3.10
v3.3.9
v3.4-beta1
v3.3.8
v3.3.7
v3.3.6
v3.3.5
v3.3.4
v3.3.3
v3.3.2
v3.3.1
v3.3.0
v3.2.9
v3.2.8
v3.3-beta2
v3.2.7
v3.3-beta1
v3.2.6
v3.2.5
v3.2.4
v3.2.3
v3.2.2
v3.2.1
v3.2.0
v3.1.11
v3.1.10
v3.2-beta2
v3.1.9
v3.2-beta1
v3.1.8
v3.1.7
v3.1.6
v3.1.5
v3.1.4
v3.1.3
v3.1.2
v3.1.1
v3.1.0
v3.0.12
v3.0.11
v3.0.10
v3.1-beta1
v3.0.9
v3.0.8
v3.0.7
v3.0.6
v3.0.5
v3.0.4
v3.0.3
v3.0.2
v3.0.1
v3.0.0
v2.11.12
v3.0-beta2
v2.11.11
v2.11.10
v3.0-beta1
v2.11.9
v2.11.8
v2.11.7
v2.11.6
v2.11.5
v2.11.4
v2.11.3
v2.11.2
v2.11.1
v2.11.0
v2.10.10
v2.10.9
v2.11-beta1
v2.10.8
v2.10.7
v2.10.6
v2.10.5
v2.10.4
v2.10.3
v2.10.2
v2.10.1
v2.10.0
v2.9.11
v2.10-beta2
v2.9.10
v2.10-beta1
v2.9.9
v2.9.8
v2.9.7
v2.9.6
v2.9.5
v2.9.4
v2.9.3
v2.9.2
v2.9.1
v2.9.0
v2.9-beta2
v2.8.9
v2.9-beta1
v2.8.8
v2.8.7
v2.8.6
v2.8.5
v2.8.4
v2.8.3
v2.8.2
v2.8.1
v2.8.0
v2.7.12
v2.7.11
v2.7.10
v2.7.9
v2.7.8
v2.7.7
v2.7.6
v2.7.5
v2.7.4
v2.7.3
v2.7.2
v2.7.1
v2.7.0
v2.6.12
v2.6.11
v2.6.10
v2.6.9
v2.7-beta1
Solcon-2020-01-06
v2.6.8
v2.6.7
v2.6.6
v2.6.5
v2.6.4
v2.6.3
v2.6.2
v2.6.1
v2.6.0
v2.5.13
v2.5.12
v2.6-beta1
v2.5.11
v2.5.10
v2.5.9
v2.5.8
v2.5.7
v2.5.6
v2.5.5
v2.5.4
v2.5.3
v2.5.2
v2.5.1
v2.5.0
v2.4.9
v2.5-beta2
v2.4.8
v2.5-beta1
v2.4.7
v2.4.6
v2.4.5
v2.4.4
v2.4.3
v2.4.2
v2.4.1
v2.4.0
v2.3.7
v2.4-beta1
v2.3.6
v2.3.5
v2.3.4
v2.3.3
v2.3.2
v2.3.1
v2.3.0
v2.2.10
v2.3-beta2
v2.2.9
v2.3-beta1
v2.2.8
v2.2.7
v2.2.6
v2.2.5
v2.2.4
v2.2.3
v2.2.2
v2.2.1
v2.2.0
v2.1.6
v2.2-beta2
v2.1.5
v2.2-beta1
v2.1.4
v2.1.3
v2.1.2
v2.1.1
v2.1.0
v2.0.10
v2.1-beta1
v2.0.9
v2.0.8
v2.0.7
v2.0.6
v2.0.5
v2.0.4
v2.0.3
v2.0.2
v2.0.1
v2.0.0
v2.0-beta3
v1.9.6
v1.9.5
v2.0-beta2
v1.9.4-r1
v1.9.3
v2.0-beta1
v1.9.2
v1.9.1
v1.9.0-r1
v1.8.4
v1.8.3
v1.8.2
v1.8.1
v1.8.0
v1.7.3
v1.7.2-r1
v1.7.1
v1.7.0
v1.6.3
v1.6.2-r1
v1.6.1-r1
1.6.1
v1.6.0
v1.5.2
v1.5.1
v1.5.0
v1.4.2
v1.4.1
v1.4.0
v1.3.2
v1.3.1
v1.3.0
v1.2.2
v1.2.1
v1.2.0
v1.1.0
v1.0.7-r1
v1.0.7
v1.0.6
v1.0.5
v1.0.4
v1.0.3-r1
v1.0.3
1.0.0
Labels
Clear labels
beta
breaking change
complexity: high
complexity: low
complexity: medium
needs milestone
netbox
pending closure
plugin candidate
pull-request
severity: high
severity: low
severity: medium
status: accepted
status: backlog
status: blocked
status: duplicate
status: needs owner
status: needs triage
status: revisions needed
status: under review
topic: GraphQL
topic: Internationalization
topic: OpenAPI
topic: UI/UX
topic: cabling
topic: event rules
topic: htmx navigation
topic: industrialization
topic: migrations
topic: plugins
topic: scripts
topic: templating
topic: testing
type: bug
type: deprecation
type: documentation
type: feature
type: housekeeping
type: translation
Mirrored from GitHub Pull Request
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/netbox#7497
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @4xoc on GitHub (Jan 12, 2023).
Originally assigned to: @arthanson on GitHub.
NetBox version
v3.4.2
Python version
3.10
Steps to Reproduce
This issue ticket covers two problems going hand in hand. First is the incorrect schema documentation in GraphiQL, the other is incorrect use of types (always string for nummeric values)
Incorrect docs:
Incorrect use of types:
Type missmatch between docs and reality:
Expected Behavior
The Schema in GraphiQL represents the correct attribute type identical to the REST API.
Nummerical values are returned as numbers in the response just like with the REST API.
The Schema in GraphiQL actually describes attributes in the correct type they are being returned in.
Observed Behavior
Schema always uses strings for all non-boolean attributes even though many attributes are clearly numbers (like ids).
Many attributes that could be represented as numbers are strings like ids.
Some attributes actually return ints like mtu on interfaces when docs say it's a string.
@ryanmerolle commented on GitHub (Feb 25, 2023):
@4xoc great issue! Would you be able to tackle this?
@4xoc commented on GitHub (Feb 27, 2023):
I'm afraid my knowledge of Python and Django is close to nothing. From looking at things I would suspect this being the main cause. IDs are generally uint64 which may not be part of
NumberFilterand thus cause the fallback to string. But this is nothing more than a guess. Not sure how that would explain differences between the docs and the actual returned type though.@4xoc commented on GitHub (Feb 27, 2023):
Apparently GraphQL doesn't support uint64 by default. One can create a custom scalar which should work for such cases.
@rmanyari commented on GitHub (Mar 1, 2023):
Happy to take a look at this, that being said, this is part of the public facing API and changes to types would imply breaking backwards compatibility (perhaps it will need a minor or even major release?)
I'm new to the project and would love the input from one of the more tenured members or maintainers.
Thanks!
@arthanson commented on GitHub (Mar 22, 2023):
@4xoc I'm not sure I'm seeing this behavior, I do the following query for introspection:
and get back for the mtu field:
Can you post a query you use and the return (wrong) values?
@4xoc commented on GitHub (Mar 27, 2023):
Yeah I looked at interface_list definition and arguments of it where MTU must be string. An interface object itself returns int correctly. To rephrase point no 3 from observed behavior: filter arguments that are int in the actual object are required to be string. In my mind id being a string is the biggest issue here.
@bluikko commented on GitHub (Apr 7, 2023):
I also was wondering about this when starting to move from REST to GraphQL. I believe this issue refers to example like this:

Is this the correct example? Note how all the IDs are of type "String" - in fact almost everything is "String" except some Booleans.
@4xoc commented on GitHub (Apr 10, 2023):
That's exactly it. I believe to have seen some other cases in but can't find any example so I may confuse this again with query parameters (which is probably worth fixing as well).
@arthanson commented on GitHub (Aug 7, 2023):
I'm not sure this is a bug, the above screenshot looks like it is from the GraphiQL browser schema pane which shows things like id as "id: [String]" but if you look at the actual schema definition yaml file it is type array of integers, which the GraphiQL is unhelpfully showing as String. From the yaml file:
That does look correct.
@4xoc commented on GitHub (Aug 7, 2023):
The result from graphql certainly is a string and is required to be a string for queries too. I believe that int32 is incorrect too, some time ago all IDs got changed to int64. IDs definitely are represented as strings.
@arthanson commented on GitHub (Aug 9, 2023):
Okay, makes sense - was getting a bit confused as I was talking about query params instead of the object itself. Probably using type ID (https://graphql.org/learn/schema/#scalar-types) would be the most correct:
"ID: The ID scalar type represents a unique identifier, often used to refetch an object or as the key for a cache. The ID type is serialized in the same way as a String; however, defining it as an ID signifies that it is not intended to be human‐readable."
@arthanson commented on GitHub (Oct 10, 2023):
As stated above GraphQL doesn't natively support int64 but you can use scalars, when we move to strawberry #9856 we can replace it with https://strawberry.rocks/docs/types/scalars#int64 marking as blocked by #9856
@arthanson commented on GitHub (May 20, 2024):
@4xoc I think this is resolved in NetBox 4.x as the new strawberry returns the fields as ID fields "The ID scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as "4") or integer (such as 4) input value will be accepted as an ID." Can you please confirm that this would resolve the issue for you.
@4xoc commented on GitHub (May 29, 2024):
I've not yet had a chance to look into a 4.x installation but looking through the documentation it appears as using ID type scalar solves the issue of supplying integers for queries.
However, on the return side of things it'll still return a string that has to be parsed client side. Looking at the docs it looks to me like maybe using BigInt (https://strawberry.rocks/docs/types/scalars#bigint-64-bit-integers) would be a better way to go. Afaik IDs in Netbox are unsigned 64 bit integers and thus should be returned as such. I don't think Python itself sees a difference as everything is just int so it probably works with bigint out of the box.
@github-actions[bot] commented on GitHub (Jun 6, 2024):
This is a reminder that additional information is needed in order to further triage this issue. If the requested details are not provided, the issue will soon be closed automatically.
@github-actions[bot] commented on GitHub (Jun 14, 2024):
This issue is being closed as no further information has been provided. If you would like to revisit this topic, please first modify your original post to include all the requested detail, and then ask that the issue be reopened.