我有一个如下所述的模型。我正在尝试做的是提供一个.filter_by(api_key=$key)
的原生能力,从我可以收集的所有内容中,需要使用比较器。那就是说,我还没有到达那里。
比较我所追求的是什么,如果是,那么在这种情况下我做错了什么?
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 :(得分: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)