Skip to content

App Code Updates for Nautobot v2

Update Code Import Locations

Most changes in code location arise from the merging of the nautobot.utilities module into the nautobot.core module.

Full table of code location changes
Old Module Class/Function(s) New Module
nautobot.core.api.utils TreeModelSerializerMixin nautobot.core.api.serializers
nautobot.core.fields (all) nautobot.core.models.fields
nautobot.core.forms SearchForm nautobot.core.forms.search
nautobot.core.utilities (all) nautobot.core.views.utils
nautobot.dcim.fields MACAddressCharField nautobot.core.models.fields
nautobot.dcim.forms MACAddressField nautobot.core.forms
nautobot.extras.api.customfields CustomFieldModelSerializerMixin nautobot.core.api.serializers
nautobot.extras.api.relationships RelationshipModelSerializerMixin nautobot.core.api.serializers
nautobot.extras.api.serializers NautobotModelSerializer nautobot.core.api.serializers
nautobot.extras.api.serializers NotesSerializerMixin nautobot.core.api.serializers
nautobot.extras.api.serializers TaggedModelSerializerMixin nautobot.extras.api.mixins
nautobot.extras.utils is_taggable nautobot.core.models.utils
nautobot.utilities.api (all) nautobot.core.api.utils
nautobot.utilities.apps (all) nautobot.core.apps
nautobot.utilities.checks (all) nautobot.core.checks
nautobot.utilities.choices (all) nautobot.core.choices
nautobot.utilities.config (all) nautobot.core.utils.config
nautobot.utilities.constants (all) nautobot.core.constants
nautobot.utilities.deprecation (all) nautobot.core.utils.deprecation
nautobot.utilities.error_handlers (all) nautobot.core.views.utils
nautobot.utilities.exceptions (all) nautobot.core.exceptions
nautobot.utilities.factory (all) nautobot.core.factory
nautobot.utilities.fields (all) nautobot.core.models.fields
nautobot.utilities.filters (all) nautobot.core.filters
nautobot.utilities.forms (all) nautobot.core.forms
nautobot.utilities.git (all) nautobot.core.utils.git
nautobot.utilities.logging (all) nautobot.core.utils.logging
nautobot.utilities.management (all) nautobot.core.management
nautobot.utilities.ordering (all) nautobot.core.utils.ordering
nautobot.utilities.paginator (all) nautobot.core.views.paginator
nautobot.utilities.permissions (all) nautobot.core.utils.permissions
nautobot.utilities.query_functions (all) nautobot.core.models.query_functions
nautobot.utilities.querysets (all) nautobot.core.models.querysets
nautobot.utilities.tables (all) nautobot.core.tables
nautobot.utilities.tasks (all) nautobot.core.tasks
nautobot.utilities.templatetags (all) nautobot.core.templatetags
nautobot.utilities.testing (all) nautobot.core.testing
nautobot.utilities.tree_queries (all) nautobot.core.models.tree_queries
nautobot.utilities.utils array_to_string nautobot.core.models.utils
nautobot.utilities.utils convert_querydict_to_factory_formset_acceptable_querydict nautobot.core.utils.requests
nautobot.utilities.utils count_related nautobot.core.models.querysets
nautobot.utilities.utils csv_format nautobot.core.views.utils
nautobot.utilities.utils deepmerge nautobot.core.utils.data
nautobot.utilities.utils dict_to_filter_params nautobot.core.api.utils
nautobot.utilities.utils dynamic_import nautobot.core.api.utils
nautobot.utilities.utils ensure_content_type_and_field_name_inquery_params nautobot.core.utils.requests
nautobot.utilities.utils flatten_dict nautobot.core.utils.data
nautobot.utilities.utils flatten_iterable nautobot.core.utils.data
nautobot.utilities.utils foreground_color nautobot.core.utils.color
nautobot.utilities.utils get_all_lookup_expr_for_field nautobot.core.utils.filtering
nautobot.utilities.utils get_api_version_serializer nautobot.core.api.utils
nautobot.utilities.utils get_changes_for_model nautobot.core.utils.lookup
nautobot.utilities.utils get_filterset_field nautobot.core.utils.filtering
nautobot.utilities.utils get_filterset_for_model nautobot.core.utils.lookup
nautobot.utilities.utils get_filterable_params_from_filter_params nautobot.core.utils.requests
nautobot.utilities.utils get_form_for_model nautobot.core.utils.lookup
nautobot.utilities.utils get_model_from_name nautobot.core.utils.lookup
nautobot.utilities.utils get_related_class_for_model nautobot.core.utils.lookup
nautobot.utilities.utils get_route_for_model nautobot.core.utils.lookup
nautobot.utilities.utils get_table_for_model nautobot.core.utils.lookup
nautobot.utilities.utils hex_to_rgb nautobot.core.utils.color
nautobot.utilities.utils is_taggable nautobot.core.models.utils
nautobot.utilities.utils is_uuid nautobot.core.utils.data
nautobot.utilities.utils lighten_color nautobot.core.utils.color
nautobot.utilities.utils normalize_querydict nautobot.core.utils.requests
nautobot.utilities.utils prepare_cloned_fields nautobot.core.views.utils
nautobot.utilities.utils pretty_print_query nautobot.core.models.utils
nautobot.utilities.utils render_jinja2 nautobot.core.utils.data
nautobot.utilities.utils rgb_to_hex nautobot.core.utils.color
nautobot.utilities.utils SerializerForAPIVersions nautobot.core.api.utils
nautobot.utilities.utils serialize_object nautobot.core.models.utils
nautobot.utilities.utils serialize_object_v2 nautobot.core.models.utils
nautobot.utilities.utils shallow_compare_dict nautobot.core.utils.data
nautobot.utilities.utils slugify_dots_to_dashes nautobot.core.models.fields
nautobot.utilities.utils slugify_dashes_to_underscores nautobot.core.models.fields
nautobot.utilities.utils to_meters nautobot.core.utils.data
nautobot.utilities.utils UtilizationData nautobot.core.utils.data
nautobot.utilities.utils versioned_serializer_selector nautobot.core.api.utils
nautobot.utilities.validators (all) nautobot.core.models.validators
nautobot.utilities.views (all) nautobot.core.views.mixins

Replace PluginMenuItem with NavMenuItem

In your app's navigation.py file. If you are still using PluginMenuItem from nautobot.extras.plugin, you should replace those code with NavMenuGroup, NavMenuItem, and NavMenuTab from nautobot.apps.ui.

For example:

Before:

    from nautobot.extras.plugins import PluginMenuItem

    menu_items = (
        PluginMenuItem(
            link="plugins:your_app:dashboard",
            link_text="Dashboard",
            permissions=["your_app.view_sync"],
        ),
        PluginMenuItem(
            link="plugins:your_app:sync_list",
            link_text="History",
            permissions=["your_app.view_sync"],
        ),
        PluginMenuItem(
            link="plugins:your_app:synclogentry_list",
            link_text="Logs",
            permissions=["your_app.view_synclogentry"],
        ),
    )

After:

from nautobot.apps.ui import NavMenuGroup, NavMenuItem, NavMenuTab


items = [
    NavMenuItem(
        link="plugins:your_app:dashboard",
        name="Dashboard",
        permissions=["your_app.view_sync"],
    ),
    NavMenuItem(
        link="plugins:your_app:sync_list",
        name="History",
        permissions=["your_app.view_sync"],
    ),
    NavMenuItem(
        link="plugins:your_app:synclogentry_list",
        name="Logs",
        permissions=["your_app.view_synclogentry"],
    ),
]

menu_items = (
    NavMenuTab(
        name="Plugins",
        groups=(NavMenuGroup(name="Your App", weight=1000, items=tuple(items)),),
    ),
)

Replace DjangoFilterBackend with NautobotFilterBackend

If your REST API has any FilterBackend classes derived from DjangoFilterBackend, you should replace DjangoFilterBackend with NautobotFilterBackend.

Revamp Rest API Serializers

NestedSerializer classes are no longer needed in Nautobot 2.0. If any NestedSerializers exist for your models, you should just remove their class definitions and references.

After removing existing NestedSerializers, you can change the fields attribute in your serializers' class Meta to __all__ and that will automatically include all the model's fields in the serializer, including related-model fields that would previously have required a reference to a NestedSerializer. If you want to exclude certain fields of the model, you can specify a list of fields you want to display in the fields attribute instead.

Include all model attributes:

class ExampleModelSerializer(NautobotModelSerializer):
    """Used for normal CRUD operations."""

    url = serializers.HyperlinkedIdentityField(view_name="plugins-api:example_plugin-api:anotherexamplemodel-detail")

    class Meta:
        model = AnotherExampleModel
        fields = "__all__"

Include only specified model attributes:

class ExampleModelSerializer(NautobotModelSerializer):
    """Used for normal CRUD operations."""

    url = serializers.HyperlinkedIdentityField(view_name="plugins-api:example_plugin-api:anotherexamplemodel-detail")

    class Meta:
        model = AnotherExampleModel
        # example_attribute_4 is not included in the serializer
        fields = ["url", "example_attribute_1", "example_attribute_2", "example_attribute_3"]

In addition, the ?brief= API query parameter is replaced by ?depth=<0-10>. As a result, the ability to specify brief_mode in DynamicModelChoiceField, DynamicModelMultipleChoiceField, and MultiMatchModelMultipleChoiceField has also been removed. For every occurrence of the aforementioned fields where you have brief_mode set to True/False (e.g. brief_mode=True), please remove the statement, leaving other occurrences of the fields where you do not have brief_mode specified as they are. Check out our API documentation for this change.

Revamp CSV Import and Export

CSV Import for models are now done automatically via the Rest API. As a result of this change, CSVForms classes are no longer needed and should be deleted. In addition, csv_headers and to_csv attributes should be removed from your model definition. Check out our release notes for this specific change.