擅长:python、mysql、java
<p>经过几个小时的尝试/错误和谷歌搜索,似乎<a href="https://gist.github.com/mrjoes/5521548" rel="nofollow noreferrer">this</a>几乎就是我想做的。问题归结为这样一个事实:当<code>ModelView</code>启动时,<code>edit_form</code>将不会被调用。因此,我认为没有直接的方法访问正在编辑的模型实例。解决方法是重写<code>edit_form</code>并hijact正在传递模型实例的<code>obj</code>变量。这是为我工作的代码(基于最小化的示例)</p>
<pre><code>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)
)
</code></pre>