Skip to content

# Registry Model Features

A dictionary of particular features (e.g. custom fields) mapped to the Nautobot models which support them, arranged by app.

## Add a new feature to the `model_features` registry

The `populate_model_features_registry()` function updates the registry model features with new apps. This is done by defining a list of dictionaries called `lookup_confs`. Each dictionary in `lookup_confs` contains the following three keys:

- `feature_name`: The name of the feature to be updated in the registry.
- `field_names`: A list of names of fields that must be present in order for the model to be considered a valid `model_feature`.
- `field_attributes`: An optional dictionary of attributes used to filter the fields. Only models with fields matching all the attributes specified in the dictionary will be considered. This parameter can be useful to narrow down the search for fields that match certain criteria. For example, if `field_attributes` is set to `{"related_model": RelationshipAssociation}`, only fields with a `related_model` of `RelationshipAssociation` will be considered.

To add a new feature to the `lookup_confs` list, follow these steps:

1. Determine the name of the feature to be added, This name should be in `snake_case` as per convention
2. Determine the names of the fields that must be present in order for the model to be considered a valid `model_feature`.
3. (Optional) Determine any field attributes that can be used to filter the fields if `field_names` would not be enough.
4. Add a new dictionary with the following keys to `lookup_confs` which is in `nautobot.extras.utils.populate_model_features_registry()`:
   - `feature_name`: The name of the feature.
   - `field_names`: The list of names of fields.
   - `field_attributes`: (Optional) The dictionary of attributes to filter the fields.

    from nautobot.extras.models.relationships import RelationshipAssociation

    def populate_model_features_registry():
        """..."""

        lookup_confs = [
            ...,
            {
                "feature_name": "relationships",
                "field_names": ["source_for_associations", "destination_for_associations"],
                "field_attributes": {"related_model": RelationshipAssociation},
            },
           ...
        ]

With this only Models which have fields names of `source_for_associations` and `destination_for_associations`, which in turn has the attribute `related_model=RelationshipAssociation`, would be a valid model for the feature `relationships`.

Note

`populate_model_features_registry()` and `lookup_confs` provide an alternative to the older method of feature flagging models via the `@extras_features` decorator. In general new feature flags should preferentially be implemented via additions to `lookup_confs`, not by any new additions to `extras_features`.