2016-11-27 61 views
0

我有一个模型如下所述。我试图做的是提供本地能力做.filter_by(api_key=$key),从我能收集的一切,需要使用比较器。也就是说,我一直无法完成。SQLAlchemy混合性能比较器

是我比较后,如果是这样,我在这种情况下做错了什么?

class ApiKey(hs_base, HomestackDatabase): 
""" 
Class that represents our API Keys table 
""" 

__tablename__ = 'ApiKeys' 

# int: API key id 
api_key_id  = Column(INTEGER(unsigned=True), primary_key=True) 

# int: User id for this key 
user_id   = Column(INTEGER(unsigned=True), ForeignKey("Users.user_id"), nullable=False) 

# bin: A UUID in binary format 
_api_key  = Column('api_key', BINARY(16), unique=True, nullable=False, default=lambda: str(uuid4()).replace('-', '').decode('hex')) 

# str: brief description for usage of this key 
description  = Column(VARCHAR(255)) 

# datetime: The time the record was originally created 
created   = Column(DATETIME, default=datetime.utcnow, nullable=False, index=True) 

# object: Convienience relationship to our User class 
user   = relationship("User") 


class ApiKeyComparator(Comparator): 
    """ 
    provides an __eq__() method that will run against both sides of the expression 
    when we're trying to filter_by(api_key=something) 
    """ 
    def __init__(self, api_key): 
     self.api_key = api_key.replace('-', '').decode('hex') 

    def __eq__(self, other): 
     return self.api_key == other.replace('-', '').decode('hex') 

@hybrid_property 
def api_key(self): 
    return str(UUID(self._api_key.encode("hex"))) 

@api_key.comparator 
def api_key(cls): 
    return ApiKey.ApiKeyComparator(cls._api_key) 

@api_key.setter 
def api_key(self, apikey): 
    self._api_key = api_key.replace('-', '').decode('hex') 

回答

0

原来读书很难。

ApiKey类中,将class ApiKeyComparator...替换为下列值。

class ApiKeyComparator(Comparator): 
    """ 
    provides an __eq__() method that will run against both sides of the expression 
    when we're trying to filter_by(api_key=something) 
    http://docs.sqlalchemy.org/en/latest/orm/extensions/hybrid.html#building-custom-comparators 
    """ 
    def __eq__(self, other): 
     return self.__clause_element__() == other.replace('-', '').decode('hex') 

@hybrid_property 
def api_key(self): 
    return str(UUID(self._api_key.encode("hex"))) 

@api_key.comparator 
def api_key(cls): 
    return ApiKey.ApiKeyComparator(cls._api_key)