根据属性的存在进行过滤(无论其值如何)

时间:2015-02-07 05:28:52

标签: python sqlalchemy

我是SQLAlchemy的新手,正在进行以下查询:

ratings = meta.Session.query(Thing) \
    .filter_by(owner = user.id)\
    .filter_by(objType = 'rating')\
    .filter(Thing.data.any(with_characteristic('ratingType', 'binary')))\
  # .filter(Thing.data.any(with_characteristic('fooCode', '.*')))\
  # .filter(Thing.data.any(with_characteristic_like('fooCode', '.*')))\
    .order_by('-lastUpdated').all()

按原样,这给了user拥有的所有东西,其objType为rating,ratingType为binary。我在两个注释行中尝试做的是过滤到二进制等级,其数据对象包含fooCode属性。我不关心fooCode是什么,我只是想把我的结果过滤到有一个的东西 - 因此我试图在那里使用正则表达式 - 这是无效的(我得到空的结果集)。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

假设您正在使用example中显示的垂直映射,只需添加另一个辅助方法并使用它:

class Thing(...):
    # ...
    @classmethod
    def with_characteristic(self, key, value):
        return self.facts.any(key=key, value=value)

    @classmethod
    def has_characteristic(self, key):
        return self.facts.any(key=key)

并使用它:

ratings = (meta.Session.query(Thing)
    .filter_by(owner = user.id)
    .filter_by(objType = 'rating')
    .filter(Thing.data.any(with_characteristic('ratingType', 'binary')))
    .filter(Thing.data.any(has_characteristic('fooCode')))
    .order_by('-lastUpdated').all()
)