'Returns a new QuerySet instance with filter_obj added to the filters.
filter_obj can be a Q object (or anything with an add_to_query()
method) or a dictionary of keyword lookup arguments.
This exists to support framework features such as \'limit_choices_to\',
and usually it will be more natural to use other methods.'

def complex_filter(self, filter_obj):

    if (isinstance(filter_obj, Q) or hasattr(filter_obj, 'add_to_query')):
        clone = self._clone()
        clone.query.add_q(filter_obj)
        return clone
    else:
        return self._filter_or_exclude(None, **filter_obj)
