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')