Nautobot v1.3

This document describes all new features and changes in Nautobot 1.3.

If you are a user migrating from NetBox to Nautobot, please refer to the "Migrating from NetBox" documentation.

Release Overview


Dynamic Group Model (#896)

A new data model for representing dynamic groups of objects has been implemented. Dynamic groups can be used to organize objects together by matching criteria such as their site location or region, for example, and are dynamically updated whenever new matching objects are created, or existing objects are updated.

For the initial release only dynamic groups of Device and VirtualMachine objects are supported.

Extend FilterSets and Filter Forms via Plugins (#1470)

Plugins can now extend existing FilterSets and Filter Forms. This allows plugins to provide alternative lookup methods or custom queries in the UI or API that may not already exist today.

You can refer to the plugin development guide on how to create new filters and fields.

GraphQL Pagination (#1109)

GraphQL list queries can now be paginated by specifying the filter parameters limit and offset. Refer to the GraphQL user guide for examples.

Job Database Model (#1001)

Installed Jobs are now represented by a data model in the Nautobot database. This allows for new functionality including:

  • The Jobs listing UI view can now be filtered and searched like most other Nautobot table/list views.
  • Job attributes (name, description, approval requirements, etc.) can now be managed via the Nautobot UI by an administrator or user with appropriate permissions to customize or override the attributes defined in the Job source code.
  • Jobs can now be identified by a slug as well as by their class_path.
  • A new set of REST API endpoints have been added to /api/extras/jobs/<uuid>/. The existing /api/extras/jobs/<class_path>/ REST API endpoints continue to work but should be considered as deprecated.
    • A new version of the REST API /api/extras/jobs/ list endpoint has been implemented as well, but by default this endpoint continues to demonstrate the pre-1.3 behavior unless the REST API client explicitly requests API version=1.3. See the section on REST API versioning, below, for more details.
  • As a minor security measure, newly installed Jobs default to enabled = False, preventing them from being run until an administrator or user with appropriate permissions updates them to be enabled for running.


As a convenience measure, when initially upgrading to Nautobot 1.3.x, any existing Jobs that have been run or scheduled previously (i.e., have at least one associated JobResult and/or ScheduledJob record) will instead default to enabled = True so that they may continue to be run without requiring changes.

For more details please refer to the Jobs feature documentation as well as the Job data model documentation.

JSON Type for Custom Fields (#897)

Custom fields can now have a type of "json". Fields of this type can be used to store arbitrary JSON data.

Natural Indexing for Common Lookups (#1638)

Many fields have had indexing added to them as well as index togethers on ObjectChange fields. This should provide a noticeable performance improvement when filtering and doing lookups.


This is going to perform several migrations to add all of the indexes. On MySQL databases and tables with 1M+ records this can take a few minutes. Every environment is different but it should be expected for this upgrade to take some time.

Overlapping/Multiple NAT Support (#630)

IP addresses can now be associated with multiple outside NAT IP addresses. To do this, set more than one IP Address to have the same NAT inside IP address.

A new version of the REST API /api/ipam/ip-addresses/* endpoints have been implemented as well, but by default this endpoint continues to demonstrate the pre-1.3 behavior unless the REST API client explicitly requests API version=1.3. See the section on REST API versioning, below, for more details.


There are some guardrails on this feature to support backwards compatibility. If you consume the REST API without specifying the version header or query argument and start associating multiple IPs to have the same NAT inside IP address, an error will be reported, because the existing REST API schema returns nat_outside as a single object, where as 1.3 and beyond will return this as a list.

Provider Network Model (#724)

A data model has been added to support representing the termination of a circuit to an external provider's network.

Python 3.10 Support (#1255)

Python 3.10 is officially supported by Nautobot now, and we are building and publishing Docker images with Python 3.10 now.

Regular Expression Support in API Filtering (#1525)

New lookup expressions for using regular expressions to filter objects by string (char) fields in the API have been added to all core filters.

The expressions re (regex), nre (negated regex), ire (case-insensitive regex), and nire (negated case-insensitive regex) lookup expressions are now dynamically-generated for filter fields inherited by subclasses of nautobot.utilities.filters.BaseFilterSet.

REST API Token Provisioning (#1374)

Nautobot now has an /api/users/tokens/ REST API endpoint where a user can provision a new REST API token. This allows a user to gain REST API access without needing to first create a token via the web UI.

$ curl -X POST \
-H "Accept: application/json; indent=4" \
-u "hankhill:I<3C3H8" \

This endpoint specifically supports Basic Authentication in addition to the other REST API authentication methods.

REST API Versioning (#1465)

Nautobot's REST API now supports multiple versions, which may be requested by modifying the HTTP Accept header on any requests sent by a REST API client. Details are in the REST API documentation, but in brief:

  • The REST API endpoints that are versioned in the 1.3.0 release are
    • /api/extras/jobs/ listing endpoint
    • /api/extras/tags/ create/put/patch endpoints
    • all /api/ipam/ip-addresses/ endpoints
  • All other REST API endpoints are currently non-versioned. However, over time more versioned REST APIs will be developed, so this is important to understand for all REST API consumers.
  • If a REST API client does not request a specific REST API version (in other words, requests Accept: application/json rather than Accept: application/json; version=1.3) the API behavior will be compatible with Nautobot 1.2, at a minimum for the remainder of the Nautobot 1.x release cycle.
  • The API behavior may change to a newer default version in a Nautobot major release (such as 2.0).
  • To request an updated (non-backwards-compatible) API endpoint, an API version must be requested corresponding at a minimum to the Nautobot major.minor version where the updated API endpoint was introduced (so to interact with the updated REST API endpoints mentioned above, Accept: application/json; version=1.3).


As a best practice, when developing a Nautobot REST API integration, your client should always request the current API version it is being developed against, rather than relying on the default API behavior (which may change with a new Nautobot major release, as noted, and which also may not include the latest and greatest API endpoints already available but not yet made default in the current release).

Webhook Pre/Post-change Data Added to Request Body (#330)

Webhooks now provide a snapshot of data before and after a change, as well as the differences between the old and new data. See the default request body section in the webhook docs.


Docker Images Now Default to Python 3.7 (#1252)

As Python 3.6 has reached end-of-life, the default Docker images published for this release (i.e. 1.3.0, stable, latest) have been updated to use Python 3.7 instead.

Job Approval Now Controlled By extras.approve_job Permission (#1490)

Similar to the existing extras.run_job permission, a new extras.approve_job permission is now enforced by the UI and the REST API when approving scheduled jobs. Only users with this permission can approve or deny approval requests; additionally such users also now require the extras.view_scheduledjob, extras.change_scheduledjob, and extras.delete_scheduledjob permissions as well.

OpenAPI 3.0 REST API documentation (#595)

The online REST API Swagger documentation (/api/docs/) has been updated from OpenAPI 2.0 format to OpenAPI 3.0 format and now supports Nautobot's REST API versioning as described above. Try /api/docs/?api_version=1.3 as an example.

Tag restriction by content-type (#872)

When created, a Tag can be associated to one or more model content-types using a many-to-many relationship. The tag will then apply only to models belonging to those associated content-types.

For users migrating from an earlier Nautobot release, any existing tags will default to being enabled for all content-types for compatibility purposes. Individual tags may subsequently edited to remove any content-types that they do not need to apply to.

Note that a Tag created programmatically via the ORM without assigning any content_types will not be applicable to any model until content-types are assigned to it.

Update Jinja2 to 3.x (#1474)

We've updated the Jinja2 dependency from version 2.11 to version 3.0.3. This may affect the syntax of any nautobot.extras.models.ComputedField objects in your database... Specifically, the template attribute, which is parsed as a Jinja2 template. Please refer to Jinja2 3.0.x's release notes to check if any changes might be required in your computed fields' templates.


Python 3.6 No Longer Supported (#1268)

As Python 3.6 has reached end-of-life, and many of Nautobot's dependencies have already dropped support for Python 3.6 as a consequence, Nautobot 1.3 and later do not support installation under Python 3.6.

v1.3.5 (2022-05-30)


  • #1606 - Added best practices for working with FilterSet classes to developer documentation.
  • #1796 - Added documentation for using Git Repositories behind/via proxies.
  • #1811 - Added developer Docker container for running mkdocs instead of locally.


  • #1818 - Changed to link to correct build status workflows.


  • #895 - Fixed validation when creating Interface and VMInterface objects via the REST API while specifying untagged_vlan without mode also set in the payload. A 400 error will now be raised as expected.
  • #1289 - Fixed issue where job result live pagination would reset to page 1 on refresh. The currently selected page will now persist until the job run completes.
  • #1290 - Fix NAPALM enable password argument for devices using the eos NAPALM driver.
  • #1427 - Fix NoReverseMatch exception when related views for action_buttons don't exist.
  • #1428 - Fix IPAM prefix utilization sometimes showing greater than 100 percent for IPv4 prefixes.
  • #1604 - Fix missing filter restriction enforcement on relationship association.
  • #1771 - Fix exception raised for RelationshipAssociation when updating source.
  • #1772 - Fix RelationshipAssociationSerializer not triggering model clean method.
  • #1784 - Fix nautobot-server dumpdata not working due to django_rq update. Updated documentation.
  • #1805 - Fix git pre-commit hook incompatibility with dash shell and add warning on skipped tests.



PyJWT - Nautobot does not directly depend on PyJWT so your upgrading Nautobot via pip or other package management tools may not pick up the patched version (we are not pinning this dependency). However some tools support an "eager" upgrade policy as an option. For example, pip install --upgrade --upgrade-strategy eager nautobot will upgrade Nautobot and all it's dependencies to their latest compatible version. This may not work for all use cases so it may be safer to update Nautobot then perform pip install --upgrade PyJWT.

Docker containers published with this build will have PyJWT upgraded.

  • #1808 - Bump PyJWT from 2.3.0 to 2.4.0

v1.3.4 (2022-05-16)


  • #1766 - Added configuration for downloaded filename branding.
  • #1752 - Added a new SearchFilter that is now used on all core filtersets to provide the q= search parameter for basic searching in list view of objects.


  • #1744 - Updated REST API token provisioning docs to include added in version.
  • #1751 - Updated secrets documentation advisory notes.


  • #1263 - Rack device image toggle added back to detail UI.
  • #1449 - Fixed a performance bug in /api/dcim/devices/ and /api/virtualization/virtual-machines/ relating to configuration contexts.
  • #1652 - Unicode now renders correctly on uses of json.dumps and yaml.dump throughout the code base.
  • #1712 - Fixed circuit termination detail view getting 500 response when it's a provider network.
  • #1755 - Fixed "Select All" helper widget from taking full UI height.
  • #1761 - Fixed typo in upgrading documentation.


v1.3.3 (2022-05-02)


  • #1481 - Pre-Generate Docs, Add Support for Plugin-Provided Docs
  • #1617 - Added run_job_for_testing helper method for testing Jobs in plugins, internally.


  • #1481 - Docs link in footer now opens link to bundled documentation instead of Read the Docs.
  • #1680 - Bump netutils dependency to 1.1.0.
  • #1700 - Revert vendoring drf-spectacular.


  • #473 - Fix get_return_url for plugin reverse URLs.
  • #1430 - Fix not being able to print Job results, related IPs.
  • #1503 - SSO users can no longer interact with or see the change password form.
  • #1515 - Further fixes for slow/unresponsive jobs results display.
  • #1538 - Fix incorrect page title alignment on the "Device Type Import" page.
  • #1678 - Custom fields with 'json' type no longer raise TypeError when filtering on an object list URL
  • #1679 - Fix a data migration error when upgrading to 1.3.x with pre-existing JobResults that reference Jobs with names exceeding 100 characters in length.
  • #1685 - Fix Hadolint issue of docker/Dockerfile.
  • #1692 - Fix duplicate tags in search list results.
  • #1697 - Fix docs incorrectly stating Celerey Redis URLs defaulting from CACHES.
  • #1701 - Fix static file serving of drf-spectacular-sidecar assets when using alternative STATICFILES_STORAGE settings.
  • #1705 - Fix NestedVMInterfaceSerializer referencing the wrong model.

v1.3.2 (2022-04-22)


  • #1219 - Add ARM64 support (alpha).
  • #1426 - Added plugin development documentation around using ObjectListView.
  • #1674 - Added flag in Dockerfile, to enable Poetry install parallelization.



  • #1659 - Added some missing test/lint commands to the development getting-started documentation, and made invoke cli parameters match invoke start/stop.
  • #1666 - Fixed errors in documentation with incomplete import statements.
  • #1682 - Fixed Nautobot health checks failing if Redis Sentinel password is required.



Critical CVEs in Django versions >= 3.2, < 3.2.13. This update upgrades Django to 3.2.13.

v1.3.1 (2022-04-19)


  • #1647 - Changed class inheritance of JobViewSet to be simpler and more self-consistent.


  • #1278 - Fixed several different errors that could be raised when working with RelationshipAssociations.
  • #1662 - Fixed nat_outside prefetch on Device API view, and displaying multiple nat_outside entries on VM detail view.

v1.3.0 (2022-04-18)


  • #630 - Added support for multiple NAT outside IP addresses.
  • #872 - Added ability to scope tags to content types.
  • #896 - Implemented support for Dynamic Groups objects.
  • #897 - Added JSON type for custom fields.
  • #1374 - Added REST API Token Provisioning. (Port of NetBox #6592 and subsequent fixes)
  • #1385 - Added MarkdownLint validation and enforcement to CI.
  • #1465 - Implemented REST API versioning.
  • #1525 - Implemented support for regex lookup expressions for BaseFilterSet filter fields in the API.
  • #1638 - Implemented numerous indexes on models natural lookup fields as well as some index togethers for ObjectChange.


  • #595 - Migrated from drf-yasg (OpenAPI 2.0) to drf-spectacular (OpenAPI 3.0) for REST API interactive Swagger documentation.
  • #792 - Poetry-installed dependencies are now identical between dev and final images.
  • #814 - Extended documentation for configuring Celery for use Redis Sentinel clustering.
  • #1225 - Relaxed uniqueness constraint on Webhook creation, allowing multiple webhooks to send to the same target address so long as their content-type(s) and action(s) do not overlap.
  • #1417 - CI scope improvements for streamlined performance.
  • #1478 - ScheduledJob REST API endpoints now enforce extras.approve_job permissions as appropriate.
  • #1479 - Updated Jobs documentation regarding the concrete Job database model.
  • #1502 Finalized Dynamic Groups implementation for 1.3 release (including documentation and integration tests).
  • #1521 - Consolidated Job REST API endpoints, taking advantage of REST API versioning.
  • #1556 - Cleaned up typos and formatting issues across docs, few code spots.


  • #794 - Fixed health check issue when using Redis Sentinel for caching with Cacheops. The Redis health check backend is now aware of Redis Sentinel.
  • #1311 - Fixed a where it was not possible to set the rack height to 0 when performing a bulk edit of device types.
  • #1476 - Fixed a bug wherein a Job run via the REST API with a missing schedule would allow approval_required to be bypassed.
  • #1504 - Fixed an error that could be encountered when migrating from Nautobot 1.1 or earlier with JobResults with very long log entries.
  • #1515 - Fix Job Result rendering performance issue causing Bad Gateway errors.
  • #1516 - Fixed MySQL unit tests running in Docker environment and revised recommended MySQL encoding settings
  • #1562 - Fixed JobResult filter form UI pointing to the wrong endpoint.
  • #1563 - Fixed UI crash when trying to execute Jobs provided by disabled plugins. A friendly error message will now be displayed.
  • #1582 - Fixed a timing issue with editing a record while its custom field(s) are in the process of being cleaned up by a background task.
  • #1632 - Fixed issue accessing request attributes when request may be None.
  • #1637 - Fixed warnings logged during REST API schema generation.

v1.3.0b1 (2022-03-11)


  • #5 - Added the option to perform a "dry run" of Git repository syncing.
  • #330 - Added pre-/post-change data to WebHooks leveraging snapshots.
  • #498 - Added custom-validator support to the RelationshipAssociation model.
  • #724 - Added Provider Network data model. (Partially based on NetBox #5986.)
  • #795 - Added ability to filter objects missing custom field values by using null.
  • #803 - Added a render_boolean template filter, which renders computed boolean values as HTML in a consistent manner.
  • #863 - Added the ability to hide a job in the UI by setting hidden = True in the Job's inner Meta class.
  • #881 - Improved the UX of the main Jobs list by adding accordion style interface that can collapse/expand jobs provided by each module.
  • #885 - Added the ability to define a soft_time_limit and time_limit in seconds as attributes of a Job's Meta.
  • #894 - Added the ability to view computed fields in an object list.
  • #898 - Added support for moving a CustomField, Relationship or ComputedField from the main tab of an object's detail page in the UI to the "Advanced" tab.
  • #1001 - Added Job database model and associated functionality.
  • #1109 - Added pagination support for GraphQL list queries.
  • #1255 - Added Python 3.10 support.
  • #1350 - Added missing methods on Circuit Termination detail view.
  • #1411 - Added concrete Job database model; added database signals to populate Job records in the database; added detail, edit, and delete views for Job records.
  • #1457 - Added new Jobs REST API, added control logic to use JobModel rather than JobClass where appropriate; improved permissions enforcement for Jobs.
  • #1470 - Added plugin framework for extending FilterSets and Filter Forms.


  • #368 - Added nautobot.extras.forms.NautobotModelForm and nautobot.extras.filters.NautobotFilterSet base classes. All form classes which inherited from all three of (BootstrapMixin, CustomFieldModelForm, and RelationshipModelForm) now inherit from NautobotModelForm as their base class. All filterset classes which inherited from all three of (BaseFilterSet, CreatedUpdatedFilterSet, and CustomFieldModelFilterSet) now inherit from NautobotFilterSet as their base class.
  • #443 - The provided "Dummy Plugin" has been renamed to "Example Plugin".
  • #591 - All uses of type() are now refactored to use isinstance() where applicable.
  • #880 - Jobs menu items now form their own top-level menu instead of a sub-section under the Extensibility menu.
  • #909 - Device, InventoryItem, and Rack serial numbers can now be up to 255 characters in length.
  • #916 - A Job.Meta.description can now contain markdown-formatted multi-line text.
  • #1107 - Circuit Provider account numbers can now be up to 100 characters in length.
  • #1252 - As Python 3.6 has reached end-of-life, the default Docker images published for this release (i.e. 1.3.0, stable, latest) have been updated to use Python 3.7 instead.
  • #1277 - Updated Django dependency to 3.2.X LTS.
  • #1307 - Updated various Python package dependencies to their latest compatible versions.
  • #1314 - Updated various development-only Python package dependencies to their latest compatible versions.
  • #1321 - Updates to various browser package dependencies. This includes updating from Material Design Icons 5.x to 6.x, which has a potential impact on plugins: a small number of icons have been removed or renamed as a result of this change.
  • #1367 - Extracted Job-related models to submodule; refined Job testing best practices.
  • #1391 - Updated Jinja2 dependency to 3.0.X.
  • #1435 - Update to Selenium 4.X.


  • #1440 - Handle models missing serializer methods, dependent from adding pre-/post-change data to WebHooks.


  • #1268 - Drop Support for Python 3.6.