如何在 Model View 中对 Flask Admin 中的 *-to-Many 关系进行自定义查询?
How to do a custom query in Model View on *-to-Many relationship in Flask Admin?
我从 Flask Admin 开始,我有一个我无法解决的问题,即使在几个小时后在文档中寻找解决它的方法也是如此。
我更改了实体的名称以便更好地理解,但这是完全相同的问题。
我在实体用户和实体技能之间存在多对多关系(我的问题与一对多关系相同):一个用户可以拥有多种技能,不同的用户可以技能相同
在创建(或编辑)实体技能的页面上,有一个用于 "Users" 关系的字段。
我有超过 100 000 个用户,当我点击该字段时它真的很慢(由于 Javascript 搜索脚本)。
为了加快速度,我只想搜索 'active' 用户(active 是我的 SQL 数据库中的布尔字段),因为确实有几个活跃用户,而且我永远不会为不活跃的用户增加技能。
我该怎么做?
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.admin.contrib.sqla import ModelView
from flask.ext.admin import Admin
app = Flask(__name__)
db = SQLAlchemy(app)
admin = Admin(app)
association_table = db.Table(
'user_skill',
db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
db.Column('skill_id', db.Integer, db.ForeignKey('skill.id'), primary_key=True)
)
class Skill(db.Model):
name = db.Column(db.String(30), nullable=True)
class User(db.Model):
username = db.Column(db.String(30), nullable=True)
skills = db.relationship(
'Skill',
secondary=association_table,
backref='users'
)
class SkillView(ModelView):
# Something like that
form_relationship_query = {'users': lambda query: query.filter_by(active=True).all()}
admin.add_view(SkillView(Skill, db.session))
我想你错过了 Flask-Admin default filters。所以在你的情况下,它应该是:
class SkillView(ModelView):
def get_query(self):
return self.session.query(self.model).filter(self.model.active == True)
def get_count_query(self):
return self.get_query().count()
感谢您的回答。
首先,我想你想说的是:
class UserView(ModelView):
def get_query(self):
return self.session.query(self.model).filter(self.model.active == True)
def get_count_query(self):
return self.get_query().count()
否则,过滤器将应用于不存在的实体技能的 "active" 列..
该解决方案有效,我已经尝试过了,但它与我正在寻找的有点不同:事实上,通过更改这些默认过滤器,我将只能在用户视图中看到活动用户。
我想要的是继续查看 UserView
中的所有用户(活动和非活动),但只能 select SkillView
.[=14 上用户字段中的活动用户=]
EDIT : 经过验证,似乎使用这个解决方案甚至没有解决我的问题:不仅我在 UserView 中看到了 active User,而且我看到了所有SkillView
字段中的用户(活动和非活动),这使得 JS 非常慢。
我找到了解决方案:
class SkillView(ModelView):
form_ajax_refs = {
'users': {
'fields': (User.username,)
}
}
这不仅显示活跃用户,而且解决了我最初的问题,即用户字段性能。现在,我们必须在用户字段中输入至少一个字母才能启动 JS 请求,并且 html 永远不会使 window 冻结。
您可以使用 ajax 加载程序对其进行改进,如下所示:
form_ajax_refs = {
'users': QueryAjaxModelLoader(
'users',
db.session,
User,
fields=['username'],
page_size=10,
filters=["active=True"]
),
}
我从 Flask Admin 开始,我有一个我无法解决的问题,即使在几个小时后在文档中寻找解决它的方法也是如此。
我更改了实体的名称以便更好地理解,但这是完全相同的问题。
我在实体用户和实体技能之间存在多对多关系(我的问题与一对多关系相同):一个用户可以拥有多种技能,不同的用户可以技能相同
在创建(或编辑)实体技能的页面上,有一个用于 "Users" 关系的字段。
我有超过 100 000 个用户,当我点击该字段时它真的很慢(由于 Javascript 搜索脚本)。
为了加快速度,我只想搜索 'active' 用户(active 是我的 SQL 数据库中的布尔字段),因为确实有几个活跃用户,而且我永远不会为不活跃的用户增加技能。
我该怎么做?
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.admin.contrib.sqla import ModelView
from flask.ext.admin import Admin
app = Flask(__name__)
db = SQLAlchemy(app)
admin = Admin(app)
association_table = db.Table(
'user_skill',
db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
db.Column('skill_id', db.Integer, db.ForeignKey('skill.id'), primary_key=True)
)
class Skill(db.Model):
name = db.Column(db.String(30), nullable=True)
class User(db.Model):
username = db.Column(db.String(30), nullable=True)
skills = db.relationship(
'Skill',
secondary=association_table,
backref='users'
)
class SkillView(ModelView):
# Something like that
form_relationship_query = {'users': lambda query: query.filter_by(active=True).all()}
admin.add_view(SkillView(Skill, db.session))
我想你错过了 Flask-Admin default filters。所以在你的情况下,它应该是:
class SkillView(ModelView):
def get_query(self):
return self.session.query(self.model).filter(self.model.active == True)
def get_count_query(self):
return self.get_query().count()
感谢您的回答。
首先,我想你想说的是:
class UserView(ModelView):
def get_query(self):
return self.session.query(self.model).filter(self.model.active == True)
def get_count_query(self):
return self.get_query().count()
否则,过滤器将应用于不存在的实体技能的 "active" 列..
该解决方案有效,我已经尝试过了,但它与我正在寻找的有点不同:事实上,通过更改这些默认过滤器,我将只能在用户视图中看到活动用户。
我想要的是继续查看 UserView
中的所有用户(活动和非活动),但只能 select SkillView
.[=14 上用户字段中的活动用户=]
EDIT : 经过验证,似乎使用这个解决方案甚至没有解决我的问题:不仅我在 UserView 中看到了 active User,而且我看到了所有SkillView
字段中的用户(活动和非活动),这使得 JS 非常慢。
我找到了解决方案:
class SkillView(ModelView):
form_ajax_refs = {
'users': {
'fields': (User.username,)
}
}
这不仅显示活跃用户,而且解决了我最初的问题,即用户字段性能。现在,我们必须在用户字段中输入至少一个字母才能启动 JS 请求,并且 html 永远不会使 window 冻结。
您可以使用 ajax 加载程序对其进行改进,如下所示:
form_ajax_refs = {
'users': QueryAjaxModelLoader(
'users',
db.session,
User,
fields=['username'],
page_size=10,
filters=["active=True"]
),
}