使用一对多关系在flask-admin中过滤列值

时间:2019-05-23 16:27:54

标签: flask flask-sqlalchemy flask-admin

我正在使用flask-admin创建一个管理界面。在我的管理面板中,我有2个表,第一个是位置,另一个是需求,它与位置具有一对多的关系。我试图在我的需求表单上过滤位置组合框,以便用户只能选择活动的组合框,但我无法对其进行管理。可能吗?如果是的话,我该怎么办。

我尝试使用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'))

1 个答案:

答案 0 :(得分:0)

经过长时间的搜索,终于找到了答案。我没有使用form_ajax_refs,而是使用query_factory进行过滤。

    class DemandView(ModelView):
        form_args = {
            'delivery_from': {
                'query_factory': lambda: Location.query.filter_by(
                    active=True
                )
            }
        }