使用一对多关系过滤 flask-admin 中的列值
Filtering column values in flask-admin with one to many relationship
我正在使用 flask-admin 创建管理界面。在我的管理面板中,我有 2 个表,第一个是位置,另一个是与位置具有一对多关系的需求。我正在尝试过滤我的需求表上的位置组合框,以便用户只能 select 活动的,但我无法管理它。可能吗?如果是,我该怎么做。
我尝试用 form_ajax_refs 做到这一点,但我失败了。
class Location(db.Model):
__tablename__ = 'Locations'
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
active = db.Column(db.Boolean)
class Demand(db.Model):
__tablename__ = 'Demands'
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
delivery_from_id = db.Column(db.Integer, db.ForeignKey('Locations.id'))
delivery_from = db.relationship(Location,
backref=db.backref('demands_from', lazy='dynamic'),
foreign_keys=[delivery_from_id],
)
class DemandView(ModelView):
form_ajax_refs = {
'delivery_from': QueryAjaxModelLoader('delivery_from', db.session, Location, fields=['name', 'active'],
filters=["active=True"]),
}
admin.add_view(ModelView(Location, db.session, 'Locations'))
admin.add_view(DemandView(Demand, db.session, 'Demands'))
经过长时间的搜索,我终于找到了答案。我没有使用 form_ajax_refs,而是使用 query_factory 进行过滤。
class DemandView(ModelView):
form_args = {
'delivery_from': {
'query_factory': lambda: Location.query.filter_by(
active=True
)
}
}
我正在使用 flask-admin 创建管理界面。在我的管理面板中,我有 2 个表,第一个是位置,另一个是与位置具有一对多关系的需求。我正在尝试过滤我的需求表上的位置组合框,以便用户只能 select 活动的,但我无法管理它。可能吗?如果是,我该怎么做。
我尝试用 form_ajax_refs 做到这一点,但我失败了。
class Location(db.Model):
__tablename__ = 'Locations'
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
active = db.Column(db.Boolean)
class Demand(db.Model):
__tablename__ = 'Demands'
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
delivery_from_id = db.Column(db.Integer, db.ForeignKey('Locations.id'))
delivery_from = db.relationship(Location,
backref=db.backref('demands_from', lazy='dynamic'),
foreign_keys=[delivery_from_id],
)
class DemandView(ModelView):
form_ajax_refs = {
'delivery_from': QueryAjaxModelLoader('delivery_from', db.session, Location, fields=['name', 'active'],
filters=["active=True"]),
}
admin.add_view(ModelView(Location, db.session, 'Locations'))
admin.add_view(DemandView(Demand, db.session, 'Demands'))
经过长时间的搜索,我终于找到了答案。我没有使用 form_ajax_refs,而是使用 query_factory 进行过滤。
class DemandView(ModelView):
form_args = {
'delivery_from': {
'query_factory': lambda: Location.query.filter_by(
active=True
)
}
}