使用Flask SQLalchemy,您可以通过未绑定方法过滤查询吗?

时间:2015-08-02 17:27:50

标签: python methods filter sqlalchemy

在我的Flask python应用程序中,我有几个互连的对象,每个对象都有自己的is_active切换到虚拟删除记录。当一个记录发生这种情况时,我希望逻辑删除与它具有相关的任何对象。这就是我想控制内容是否在应用程序中发布的方式。

由于除了相关的is_active字段之外还有其他考虑因素可以考虑,我在每个模型中定义了一个方法,如下所示:

def is_published(self):
    """
        Considers all needed criteria for visibility on the website,
        returning a boolean to reflect current publication status
    """
    if self.is_active and self.member.active and self.published_on:
        return True
    return False

其中member是通过外键定义的关系。基本上,只有在(a)它处于活动状态,(b)拥有它的成员是活动的,以及(c)它定义了发布日期,替换初始空值时,才能看到此记录。

稍后,当我想查询所有这些已发布记录的列表时,我可以执行以下操作:

articles = ArticleModel.query\
    .join(MemberModel, MemberModel.id==ArticleModel.member_id)\
    .filter(ArticleModel.is_active==True)\
    .filter(ArticleModel.published_on!=None)\
    .filter(MemberModel.active==True)\
    .order_by(desc(ArticleModel.modified_at))\
    .all()

这样可行,但如果我想稍后更改“已发布”的定义,我必须找到此条件的所有实例并进行调整。我更愿意参考该模型的方法(或该复杂标准的其他中心位置)。

我想知道我是否可以设置查询来执行以下操作:

articles = ArticleModel.query\
    .join(MemberModel, MemberModel.id==ArticleModel.member_id)\
    .filter(ArticleModel.is_published()==True)\
    .order_by(desc(ArticleModel.modified_at))\
    .all()

Python不喜欢该过滤行,返回错误:TypeError: unbound method is_published() must be called with ArticleModel instance as first argument (got nothing instead)

有没有办法在一个地方为特定模型设置多个过滤器并在查询中引用它?

1 个答案:

答案 0 :(得分:1)

您是否尝试过使用混合属性(docsmore docs)?

修改
下面是code example(不是一个非常好的用例)。它会self.title作为self.short_title的后退。

class SomeModel(db.Model):
    # init blabla
    ...

    @hybrid_property
    def short_title(self):
        return self._short_title if self._short_title is not None else self.title

    @short_title.expression
    def short_title(self):
        return db.case(
            [(Category._short_title == None, Category.title)],
            else_=Category._short_title
        )

    @short_title.setter
    def short_title(self, short_title):
        self._short_title = short_title