Ich habe ein Modell wie unten beschrieben. Was ich versuche zu tun, ist die native Fähigkeit, eine .filter_by(api_key=$key)
zu tun, die von allem, was ich sammeln kann, erfordert die Verwendung eines Komparators. Das heißt, ich konnte nicht ganz dorthin gelangen.SQLAlchemy Hybrid Comparator
Ist ein Komparator, was ich bin, und wenn ja, was mache ich in diesem Fall falsch?
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')