def clean_by_fields(self, obj, fields, get_field_fn, exclude_list):
        """
        Function used to exclude defined fields from object collect.
        :param obj: the object we are collecting
        :param fields: every field related to this object (direct or reverse one)
        :param get_field_fn: function used to get accessor for each field
        :param exclude_list: model/fields we have defined to be excluded from collect
        :return: fields that are allowed to be collected
        """
        cleaned_list = []
        obj_model = get_model_from_instance(obj)

        for field in fields:
            field_accessor = get_field_fn(field)
            # This field is excluded if:
            # 1/ it's parent model key is in exclude list keys
            # AND
            # 2/ the field has been defined as excluded for this parent model
            is_excluded = obj_model in exclude_list and field_accessor in exclude_list[obj_model]

            if not is_excluded:
                cleaned_list.append(field)

        return cleaned_list