2014-12-16 2 views
1

Я пишу приложение, используя расширение Python + Flask-SqlAlchemy.По умолчанию для запросов с использованием Python + Flask-SqlAlchemy

У меня есть следующий код:

class Resource(db.Model): 
    __tablename__ = 'resources' 
    id = db.Column(db.Integer, primary_key=True) 
    created_at = db.Column(db.DateTime) 
    updated_at = db.Column(db.DateTime) 
    is_active = db.Column(db.Boolean) 
    key = db.Column(db.String(64)) 
    title = db.Column(db.String(64)) 

    def __init__(self): 
     self.created_at = datetime.now() 
     self.updated_at = datetime.now() 
     self.is_active = 1 

@app.route('/resources', methods=['GET']) 
def resources_get_all(): 
    get_limits() 
    resources = [] 
    data = Resource.query.filter(Resource.is_active == 1).limit(LIMIT).offset(OFFSET).all() 
    for row in data: 
     resources.append(
      resources_show(row) 
     ) 
    return envelope(resources) 

Есть ли способ, чтобы сделать все запросы к базе данных автоматически реализует .filter(ModelName.is_active == 1).limit(LIMIT).offset(OFFSET)? Я не хочу передавать этот блок во все запросы во всем приложении. Я хочу создать что-то вроде области по умолчанию для запросов.

+2

возможного дубликата flask_sqlalchemy о [SQLAlchemy - вы можете добавить собственные методы объекта запроса?] (HTTP: //stackoverflow.com/questions/15936111/sqlalchemy-can-you-add-custom-methods-to-the-query-object) – dirn

+0

Я не думаю, что это дублированный вопрос. Он пытается достичь такого же поведения Rails ActiveRecord Scopes. – armandomiani

ответ

2

Один из способов - добавить метод класса. С определением класса python вы можете, кстати, добавить свои собственные методы.

class Resource(db.Model): 
    # .... your existing code 
    @staticmethod 
    def customq(limit, offset): 
     """This method returns an instance of flask_sqlalchemy.BaseQuery""" 
     return Resource.query.filter_by(is_active=1).limit(limit).offset(offset) 

Тогда ваш пример кода становится:

@app.route('/resources', methods=['GET']) 
def resources_get_all(): 
    get_limits() 
    resources = [] 
    data = Resource.customq(LIMIT, OFFSET).all() 

Вот документация по BaseQuery

+0

Это именно то, что я искал. Спасибо! – stefanobaldo

+0

Немного исправления: return Resource.query.filter_by (is_active = 1) .limit (limit) .offset (offset) – stefanobaldo

+0

@stefanobaldo, обновлено. Моя опечатка. Я рад, что это вам помогло. – chfw

Смежные вопросы