def METHOD_NAME(obj, recurse=0, prettyprint=False, starting_depth=0):
    if isinstance(obj, Model):
        starting_depth += 1
        tab = "  " * starting_depth * bool(prettyprint)
        args_newline = "\n" if prettyprint else " "
        class_newline = "\n" if prettyprint else ""
        # Keep `recurse` non-negative
        recurse = max(recurse, 0)
        fn = METHOD_NAME if recurse else lambda *args: str(args[0])
        recurse -= 1
        model_class = obj._meta.model
        args = []
        for f in model_class._meta.get_fields():
            if (
                f.name not in ["password", "auth_token", "confirmation_token"]
                and hasattr(obj, f.name)
                and getattr(obj, f.name)
                and not (f.is_relation and (f.many_to_many or f.one_to_many))
            ):
                raw_value = getattr(obj, f.name)
                try:
                    value = fn(raw_value, recurse, prettyprint, starting_depth)
                except RecursionError:
                    value = str(raw_value)
                if f.name == "action_flag" and value.isnumeric():
                    value = int(value)
                    if value == ADDITION:
                        value = '"Addition"'
                    elif value == CHANGE:
                        value = '"Change"'
                    elif value == DELETION:
                        value = '"Deletion"'
                args.append(f"{tab}{f.name}={value}")
        args = f",{args_newline}".join(args)
        tab = tab[:-2]
        return f"{model_class.__name__}({class_newline}{args}{class_newline}{tab})"
    if isinstance(obj, str):
        return f'"{obj}"'
    return str(obj)