如何为此自定义可变JSONB列返回适当的hybrid_property?

时间:2018-10-03 14:08:52

标签: python postgresql sqlalchemy

我不确定该如何措辞,所以我会尽力而为。

基本上,我正在尝试确定用户行“ own_products”中的Mutable JSONB列是否包含非演示产品。

让我稍微打开一下包装:

我的模型的列如下所示-

owned_products = Column(MutableDict.as_mutable(JSONB), default=default_products)

我的MutableDict类从此处直接撕开-Mutation Tracking

我的字典总是这样:

default_products = {
    'product-1': False,
    'product-1-demo': False,
    'product-2': False,
    'product-3': False,
    'product-3-demo': False,
    ... ... so on and so forth

}

这确实很好,并且允许我像常规字典一样添加/更新/过滤产品。但是我最近发现了@hybrid_property装饰器,我想通过提供诸如User.owns_any_paid_product或User.owns_any_ {x-product-range}之类的东西将其合并到我的模型中,以便按产品对用户进行排序更快。

在第一次尝试使我陷于困境之后,这就是我到目前为止所拥有的

    @hybrid_property
    def owns_any_paid(self):
        for product in self.owned_products:
            if (product in paid_products) and (self.owned_products[product]):
                return True
        return False

    @owns_any_paid.expression
    def owns_any_paid(cls):
        return cls.??????

我很难找到可以满足此要求的cls。过去我知道我可以通过执行session.query(User).filter(User.owned_products.contains({k, v}))

来过滤此字典

但是在这种模式下,我必须创建一个这样的过滤器列表(例如,我希望每个人除了产品演示外什么都不拥有):

    filter_list = [~User.owned_products.contains({k,v}) for k, v in paid_products.items()]

    session.query(User).filter(*filter_list)

而且我不知道如何将其作为我的hybrid_property.expression的有效cls返回。

有人对此有任何建议吗?

编辑--------------

对于任何发现此问题的人。我设法使用了sqlalchemy的case()功能来解决此问题……再加上一些随机运气。

下面的代码段

    @owns_any_paid.expression
    def owns_any_paid(cls):
        return case([(cls.owned_products[k].astext.cast(Boolean), v) for k,v in paid_products.items()])

0 个答案:

没有答案