我不确定该如何措辞,所以我会尽力而为。
基本上,我正在尝试确定用户行“ 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()])