我不确定以下是否是错误/未实施。
以下情况:
我的MongoDB中有以下json片段:
[{
"firstname": "Test",
"surname": "Test",
"email_address": "example@example.com",
"country": "Austria",
"holiday_home": {
"address": "",
"address_2": "",
"city": "",
"country": "Germany",
"postal_code": "",
"state_province": ""
}
}]
我设法在“标准视图”中显示“第一级值”(名字,姓氏,电子邮件,国家/地区),没有任何问题:
class RegistrantView(ModelView):
column_list = ('firstname', 'surname', 'email_address', 'country')
form = RegistrantForm
不幸的是,我无法访问嵌套在“holiday_home”中的密钥/值。
我尝试了很多方法,比如column_list = ([holiday_home]['country'])
,但遗憾的是没有成功。
因此,我想问一下,如果使用带有pymongo的flask-admin,这是否可行。
答案 0 :(得分:0)
老问题,但就目前而言,似乎无法直接从 PyMongo ModelView 执行请求。这意味着,默认情况下没有特殊符号允许您从嵌套文档中获取值。
话虽如此,我只是在这里分享了关于这个非常具体问题的两个解决方案: https://github.com/flask-admin/flask-admin/issues/1585
首先,您可以在您的 flask_admin_custom.contrib.pymongo.views 中复制/覆盖 : _get_field_value 函数,以便它更好地处理点符号,如“holiday_home.country”。一个提议是:
def _get_field_value(self, model, name):
"""
Get unformatted field value from the model
"""
try:
return reduce(dict.get, name.split('.'), model)
except AttributeError:
return model.get(name)
如果您认为与官方 Flask 管理代码完全不同,您仍然可以使用 Joost 指出的列格式化程序。 为此,只需在您的列列表中添加一个自定义名称:
column_list = ("firstname","surname", "email_address" "country")
然后在您的列格式化程序中捕获此确切名称:
column_formatter = {
'country' : _country_formatter
}
不要忘记在代码中的某处定义格式化函数,例如:
def _country_formatter(view, context, model, name):
return model['holyday_home']['country']
就是这样!
第二个解决方案听起来更像是一个黑客,但我认为这是目前大多数人的做法。