Adding Custom Target Matcher

The role of the TargetMatchManager is to return a queryset of targets that match a given set of parameters. By default, the TOM Toolkit includes a TargetMatchManager that contains a check_for_fuzzy_match function that will return a queryset of TargetNames that are “similar” to a given string. This function will check for case-insensitive aliases while ignoring spaces, dashes, underscore, and parentheses. This function is used during validate_unique when the target is saved to ensure that redundant targets are not added.

Under certain circumstances a user may wish to modify or add to this behavior.

Using the TargetMatchManager

The TargetMatchManager is a django model manager defined as Target.matches. Django model managers are described in more detail in the Django Docs.

Overriding the TargetMatchManager

To start, find the MATCH_MANAGERS definition in your settings.py:

# Define MATCH_MANAGERS here. This is a dictionary that contains a dotted module path to the desired match manager
# for a given model.
# For example:
# MATCH_MANAGERS = {
#    "Target": "my_custom_code.match_managers.MyCustomTargetMatchManager"
# }
MATCH_MANAGERS = {}

Add the path to your custom TargetMatchManager to the “Target” key of the MATCH_MANAGERS dictionary as shown in the example.

Your can the override the default TargetMatchManager by writing your own in the location you used above.

Remember the TargetMatchManager must contain a check_for_fuzzy_match function and return a queryset. See the following example for only checking for exact name matches:

class CustomTargetMatchManager(models.Manager):
"""
Return Queryset for target with name matching string.
"""
def check_for_fuzzy_match(self, name):
    """
    Returns a queryset exactly matching name that is received
    :param name: The string against which target names will be matched.
    :return: queryset containing matching Target(s).
    """
    queryset = super().get_queryset().filter(name=name)
    return queryset

This might be useful if a user is experiencing performance issues when ingesting targets or does not wish to allow for a target matching to similar strings.