from django.db.models import Manager, Q, QAnd, QOr, QNot

def get_query(obj):
    if isinstance(obj, Manager):
        return obj.query
    return obj

class CustomQueryManager(Manager):
    
    def __init__(self, query=None):
        if query:
            self.query = query
        Manager.__init__(self)
    
    def __and__(self, q):
        return self.__class__(self.query & get_query(q))
    
    def __or__(self, q):
        return self.__class__(self.query | get_query(q))
    
    def not_(self):
        return self.__class__(QNot(self.query))
    
    def get_query_set(self):
        return Manager.get_query_set(self).filter(self.query)