'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, Filter):
        clone = self._clone()
        clone._filters.add(filter_obj)
        return clone
    return self._filter_or_exclude(None, **filter_obj)
