Flask SQLAlchemy - StaticMethod vs Custom Querying Class

Alo*_*onP 7 python model flask flask-sqlalchemy

我有一个Event带有两个start_datedue_date列的模型.我想创建一种简单的方法来获取所有活动事件(已经启动但尚未完成).

这是我的Event模型类:

class Event(db.Model):
    __tablename__ = 'events'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(254))
    description = db.Column(db.Text)
    start_date = db.Column(db.DateTime)
    due_date = db.Column(db.DateTime)
Run Code Online (Sandbox Code Playgroud)

我熟悉两种有效的解决方案:

1:使用一个staticmethod函数,它将在Event.query对象上生成所有过滤器并返回一个完整的活动事件列表

class Event(BaseModel):
    ...
    @staticmethod
    def get_active():
         return Event.query.filter(...).all()

# Usage:
records = Event.get_active()
Run Code Online (Sandbox Code Playgroud)

2:通过创建一个继承自的新查询对象BaseQuery,并将此新"EventQuery"类分配给Model的query_class成员.

class EventQuery(BaseQuery):
    def get_active(self):
        return self.filter(...)

class Event(BaseModel):
    __tablename__ = 'events'
    query_class = EventQuery
    ....

# Usage:
Event.query.get_active().all()
Run Code Online (Sandbox Code Playgroud)

所以我想知道,哪种方法更好/推荐?

swe*_*ren 4

对于一个简单的孤立的例子,我认为这并不重要。对于更大更复杂的情况,选项 2 提供了额外的灵活性,可以将您的过滤器与其他过滤器组合起来。

Event.query.filter_by(user_id=1).get_active().all()

诚然,您可以修改选项 1,以便它将查询作为参数并返回新查询,但随后它将开始看起来与典型的 SQLAlchemy 查询有很大不同。