SQLAlchemy混合属性比较器

时间:2016-11-27 14:43:42

标签: python-2.7 sqlalchemy

我有一个如下所述的模型。我正在尝试做的是提供一个.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')

1 个答案:

答案 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)