def introspect(self, model, exclude=()):
        """
        Start with given model and recursively walk through its relationships.

        Returns a dict with all model labels and their fields found.
        """
        result = {}
        open_set = deque([model])
        closed_set = list(exclude)

        while open_set:
            model = open_set.popleft()
            model_label = self.model_label(model)

            if model_label in closed_set:
                continue

            model_fields = OrderedDict()
            for field in self.get_fields(model):
                if not isinstance(field, DjangoQLField):
                    field = self.get_field_instance(model, field)
                if not field:
                    continue
                if isinstance(field, RelationField):
                    if field.relation not in closed_set:
                        model_fields[field.name] = field
                        open_set.append(field.related_model)
                else:
                    model_fields[field.name] = field

            result[model_label] = model_fields
            closed_set.append(model_label)

        return result
Start with given model and recursively walk through its relationships.

        Returns a dict with all model labels and their fields found.