mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-12 05:20:31 +01:00
GraphQL: Support for filtering on custom fields #5540
Closed
opened 2025-12-29 19:29:08 +01:00 by adam
·
20 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#5540
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 @emil-nasso on GitHub (Oct 21, 2021).
Originally assigned to: @jeremystretch, @jeremypng on GitHub.
NetBox version
v3.0.3
Feature type
New functionality
Proposed functionality
There doesn't seem to be a way to filter based on custom fields in the GraphQL-api.
The documentation mentions "The GraphQL API employs the same filtering logic as the UI and REST API" so one approach would be to just follow the same pattern where
cf_foo_baretc are exposed as arguments for the list query of an entity wherefoo_baris a custom field.(Reference to discussion about this: https://github.com/netbox-community/netbox/discussions/7569 )
Use case
We have the use for this when listing tenants via the graphql API. We put the customers name in the name field but we have a custom field where we have an internal identifier that is used as a reference when linking the data in netbox up with other systems though integrations.
Database changes
No response
External dependencies
No response
@candlerb commented on GitHub (Oct 21, 2021):
Another way might be via a graphql query on
custom_fields. I note that you can ask forcustom_fieldsin a response:(There's also
custom_field_datawhich returns a string holding JSON). But as far as I can tell, you can't currently filter oncustom_fieldsin a query:It would of course be good if such a query could be pushed down to a SQL condition in postgres, rather than making Netbox retrieve all objects from the database and discard the ones which don't match.
@github-actions[bot] commented on GitHub (Dec 21, 2021):
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. Please see our contributing guide.
@jeremystretch commented on GitHub (Jul 27, 2022):
Blocked by #9856
@github-actions[bot] commented on GitHub (Nov 27, 2022):
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.
@arthanson commented on GitHub (Mar 13, 2023):
Blocked on #11949
@arthanson commented on GitHub (Apr 21, 2023):
Adding blocked until #9856
@einstux commented on GitHub (Apr 23, 2024):
@arthanson Since #9856 is done, can you unblock this issue? Any ideas if and when this is now going to happen?
@jeremystretch commented on GitHub (Apr 23, 2024):
I've marked this as "needs owner" for anyone who would like to take a stab at implementing this for v4.0 (with the new Strawberry GraphQL backend). @arthanson anything in particular you'd like to point out for this?
@christophbeberweil commented on GitHub (Aug 5, 2024):
I would like to take a stab at it :) Right now I am looking into extending
extras.graphql.mixins.CustomFieldsMixin, which seems to be a promising candidate for this change. Does anyone have a concrete preference how this should be implemented? If so feel free to leave any pointers@jeremystretch commented on GitHub (Aug 6, 2024):
@christophbeberweil thanks, I've assigned this to you.
@christophbeberweil commented on GitHub (Sep 4, 2024):
Hey @jeremystretch,
I think I found a way to enable filtering of custom fields in GraphQL. My solution works by extending
netbox.graphql.filter_mixins.autotype_decorator, in such a way thatcreate_attribute_and_functionis called for each applicable CustomField of the decrated filter.This works for
strfields (foo_txt) but unfortunately, the filter method seems to iterate over the querystring and search for each occurrence of the letter in the custom field. While this does search, it is obviously not usable. Could I use StrFilterLookup instead? I saw its definition in the Graph_i_QL frontend, but not in the source code. Or is there another way to define the actual filter behaviour that I missed?Speaking of the Graph_i_QL frontend, while the backend detects my new filter
cf_foo_txt, but the lint in GraphiQL does not know ofcf_foo_txt.When I create a new custom field
a_intfordcim.Devicewith type integer it is not recognized in the graphql api unless the server is restarted. Do you know of a way how to make graphql aware of changing custom fields at runtime, without the need for a server restart?After I restart the server, resolve_field raises an exception (AttributeError: 'NoneType' object has no attribute 'model') in
netbox.filtersets.BaseFilterSet.get_additional_lookupsbecause the field_namecustom_field_data__a_intqueryied by get_model_field can not be found on the model Device. Interestingly, exactly the same code works fine for a CustomField of type str. What could be the reason for this?Since these changes are not ready for merging, I did not open a merge request. Please consider this commit:
ad78d04bb6Thanks :)
@christophbeberweil commented on GitHub (Sep 17, 2024):
Hi @jeremystretch, did you have a chance to look at my questions yet? Maybe you could indicate if my changes go in the right directopn from your point of view?
Thanks
@jeremystretch commented on GitHub (Sep 17, 2024):
@christophbeberweil I am not able to spend time on this, hence it being tagged for a volunteer. If you need help, I recommend reaching out to others in the community to see if they're able to assist.
@jeremypng commented on GitHub (Jan 8, 2025):
I worked on this today, building on @christophbeberweil's work and have it working for exact string queries against custom fields so far. I'm still working on the integer and other field types.
A couple of things:
My code is here for the moment. Happy to discuss further.
@jeremypng commented on GitHub (Jan 10, 2025):
I've got this ready to submit a PR. If someone (@jeremystretch or @arthanson) can assign it to me, I'll submit it. I ended up making a few more changes to get this working smoothly.
Here is the link to my code at this point.
@jeremypng commented on GitHub (Jan 18, 2025):
I have the custom field filtering itself working pretty well. However, the rest of the graphql implementation is in such bad shape, I'm going a different route. Introspecting the django fitlers and models to try to infer a graphql schema at import time is very complex and requires gutting Strawberry of most of its power.
I've cycled through most of the options outlined by @arthanson in Issue #17688 and come to some conclusions that there is a better way to solve this. I'll start a discussion around this.
@jeremystretch commented on GitHub (Jan 20, 2025):
@jeremypng thanks for starting this discussion. I haven't had any time to dedicate to the theme of GraphQL recently and @arthanson is currently loaned out for another initiative, but I hope we can prioritize this work soon as it's clearly a pain point for NetBox users.
@jeremypng commented on GitHub (Jan 23, 2025):
This is fixed in my branch here:
https://github.com/jeremypng/netbox/tree/refs/heads/graphql-filter-redesign
New query syntax for custom fields:
results:
If you'll assign this to me, I'll tag this issue in the PR.
@jeremystretch commented on GitHub (Feb 7, 2025):
@jeremypng I've tagged this for v4.3 and assigned it to you. Could you open a PR from your branch into
featureplease?@jeremystretch commented on GitHub (Mar 10, 2025):
We've finally got this merged into
featurefor NetBox v4.3! 🎉 A huge thanks to @jeremypng for driving this effort!