2017-08-25 126 views
1

我有一個Event模型,其中有start_datedue_date列。 我想創建一個簡單的方法來獲取所有活動事件(已經開始但尚未完成)。燒瓶SQLAlchemy - StaticMethod與自定義查詢類

這是我的事件模型類:

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) 

我熟悉這方面的需要兩個工作方案:

1:用staticmethod功能,這將使該事件的所有過濾器。查詢對象並返回活動事件的完整列表

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

# Usage: 
records = Event.get_active() 

2:通過創建一個從BaseQuery繼承的新查詢對象,並將此新的「EventQuery」類分配給模型的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() 

所以我想知道,哪種方法更好/推薦?

+1

沒關係。 – davidism

+1

通過什麼指標? 1可能更直接,更容易維護 – chasmani

+0

我看到很多人在這裏推薦創建自定義查詢類,就像我以第二種方式展示的那樣,所以我徘徊,如果這有一個實際的原因...肯定是第一種方式那麼爲什麼在這個「不必要的」自定義查詢功能上有這麼多的文檔呢? – AlonP

回答

0

對於一個簡單的孤立例子,我認爲它不重要。對於更大更復雜的情況,選項2提供了更高的靈活性,可將您的過濾器與其他過濾器結合使用

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

誠然,你可以修改選項1,因此,它需要查詢作爲參數,並返回一個新的查詢,但隨後就開始尋找比典型的SQLAlchemy查詢而不同。