# Path: django_sonic_screwdriver/iterables.py
# def get_iterable(data):
#     """
#     Returns iterable data.
#     """
#     if isinstance(data, QueryDict):
#         return data.lists()
#     else:
#         return data.items()
# 
# def is_iterable(obj):
#     """
#     Check if obj is iterable.
#     """
#     try:
#         iter(obj)
#     except TypeError:
#         return False
#     else:
#         return True


import collections
import re
from django.core.files import File
from django.http import QueryDict
from django.utils.encoding import force_text
from django.utils.functional import Promise
from .iterables import get_iterable, is_iterable
            if isinstance(key, str) and "_" in key and key[0] != "_":
                new_key = re.sub(camelize_re, underscore_to_camel, key)
            else:
                new_key = key
            new_dict[new_key] = camelize(value)
        return new_dict
    if is_iterable(data) and not isinstance(data, str):
        return [camelize(item) for item in data]
    return data


def underscoreize(data):
    """
    Underscoring data.
    """
    if isinstance(data, dict):
        new_dict = {}
        for key, value in get_iterable(data):
            if isinstance(key, str):
                new_key = camel_to_underscore(key)
            else:
                new_key = key
            new_dict[new_key] = underscoreize(value)

        if isinstance(data, QueryDict):
            new_query = QueryDict(mutable=True)
            for key, value in new_dict.items():
                new_query.setlist(key, value)
            return new_query
        return new_dict

# Path: django_sonic_screwdriver/iterables.py
# def get_iterable(data):
#     """
#     Returns iterable data.
#     """
#     if isinstance(data, QueryDict):
#         return data.lists()
#     else:
#         return data.items()
# 
# def is_iterable(obj):
#     """
#     Check if obj is iterable.
#     """
#     try:
#         iter(obj)
#     except TypeError:
#         return False
#     else:
#         return True


# Path: django_sonic_screwdriver/helper.py
import collections
import re
from django.core.files import File
from django.http import QueryDict
from django.utils.encoding import force_text
from django.utils.functional import Promise
from .iterables import get_iterable, is_iterable

            if isinstance(key, str) and "_" in key and key[0] != "_":
                new_key = re.sub(camelize_re, underscore_to_camel, key)
            else:
                new_key = key
            new_dict[new_key] = camelize(value)
        return new_dict
    if is_iterable(data) and not isinstance(data, str):
        return [camelize(item) for item in data]
    return data


def underscoreize(data):
    """
    Underscoring data.
    """
    if isinstance(data, dict):
        new_dict = {}
        for key, value in get_iterable(data):
            if isinstance(key, str):
                new_key = camel_to_underscore(key)
            else:
                new_key = key
            new_dict[new_key] = underscoreize(value)

        if isinstance(data, QueryDict):
            new_query = QueryDict(mutable=True)
            for key, value in new_dict.items():
                new_query.setlist(key, value)
            return new_query
        return new_dict

    if is_iterable(data) and not isinstance(data, (str, File)):