将过滤器添加到UserView

时间:2018-01-31 19:45:06

标签: python flask-sqlalchemy flask-admin

刚刚使用flaskadmin和CRUD进行关系对于管理视图非常有用,但我需要的是受限制的用户视图。是否可以创建用户视图,因此登录用户只能看到他的数据,而不能看到用户的数据? (也不是其他用户)

我正在寻找一种向每个dbsession查询添加"WHERE id = 1"之类的方法。

感谢您的帮助! MS

我的代码如下所示:

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://xx:xyz@localhost/db'
db = SQLAlchemy(app)
admin = Admin(app, template_mode='bootstrap3')

class Users(Base):
    __tablename__ = 'users' # portal user
    id = db.Column(Integer, primary_key=True)
    email = db.Column(String(255), nullable=False)
    password = db.Column(String(255), nullable=False)
    active = db.Column(Boolean, nullable=False)
    data = db.relationship("Data", back_populates="users")

    def __repr__(self):
        return '%s' % (self.email)

class UsersView(ModelView):
    form_excluded_columns = ['active']

class Data(Base):
    __tablename__ = 'data'
    id = db.Column(Integer, primary_key=True)
    user_id = db.Column(Integer, ForeignKey('user.id'), nullable=False)
    user_email = db.relationship("Users", back_populates="email")
    somesecrets = db.Column(String(255), nullable=False)


admin.add_view(UsersView(Users, db.session))
admin.add_view(ModelView(Data, db.session))

1 个答案:

答案 0 :(得分:0)

您需要覆盖get_query_count课程的get_queryModelView方法。

例如:

class DataView(ModelView):

    def get_query(self):
        current_user_id = get_current_user_id()
        return self.session.query(self.model).filter(Data.user_id == current_user_id)

    def get_count_query(self):
        current_user_id = get_current_user_id()
        return self.session.query(func.count('*')).select_from(self.model).filter(Data.user_id == current_user_id)

...

admin.add_view(UsersView(Users, db.session))
admin.add_view(DataView(Data, db.session))

如果您使用Flask-SecurityFlask-Login之类的内容,则可以轻松获取当前登录的用户。