我在用flask_admin
允许管理员用户访问数据库,其中呈现一对多关系。编辑条目时,我希望下拉菜单仅显示满足条件的选项。我虽然query_factory
可以做到这一点。以下是我现在拥有的最小示例:
class OneSideObj(db.Model):
id = db.Column(db.Integer, primary_key=True)
active = db.Column(db.Boolean)
many_side_obj_id = db.Column(
db.Integer,
db.ForeignKey('many_side_obj.id')
)
class ManySideObj(db.Model):
id = db.Column(db.Integer, primary_key=True)
one_side_objs = db.relationship(
'OneSideObj',
backref = 'many_side_obj',
lazy = 'dynamic',
)
def get_manysideobj_id(*args):
##################
# how to get id? #
##################
return id
class ManySideObjView(ModelView):
id = get_manysideobj_id(*some_args) # <--- get current many_side_obj id
form_args = {
'one_side_objs': {
'query_factory': lambda: query_filter(id)
}
}
def query_filter(id):
return OneSideObj.query.filter(
(OneSideObj.many_side_obj_id == id) | (OneSideObj.active == False)
)
我希望该字段显示的查询全部处于非活动状态OneSideObj
,或活跃的但具有匹配的many_side_obj_id
。我一直坚持获取当前模型实例 ID。这似乎是一个简单的任务,但我找不到方法。或者也许这种方法不可行?
经过几个小时的尝试/错误和谷歌搜索后,似乎this https://gist.github.com/mrjoes/5521548几乎就是我想做的。问题归结为这样一个事实:edit_form
时不会被调用ModelView
发起。因此我相信没有直接的方法来访问正在编辑的模型实例。解决方法是覆盖edit_form
并劫持obj
传递模型实例的变量。这是适合我的代码(基于最小化的示例)
class ManySideObjView(ModelView):
# model instance is passed to edit_form as obj
def edit_form(self, obj):
return self._filtered(
super(ManySideObjView, self).edit_form(obj), obj.id
)
# save id in self._instance_id and access it from _get_list
def _filtered(self, form, id):
self._instance_id = id
form.one_side_objs.query_factory = self._get_list
return form
# actual query logic
def _get_list(self):
id = self._instance_id
return self.session.query(OneSideObj).filter(
(OneSideObj.active == False) | (OneSideObj.many_side_obj_id == id)
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)