我用 Flask Admin 和 mongoengine 制作了两个 API,这就是我的文档在第一个 API 中的样子。
class Score(db.Document):
score = StringField(required=True)
section= ReferenceField(ScoreDocument,db_field='score',required=True)
name = StringField(required=True)
meta = {
'collection': 'score',
}
要在第二个API中获取分数数据,这就是我所做的
class ScoreDocument(db.Document):
score = StringField(required=True)
meta = {
'collection': 'score',
strict = False
}
class DisplayType(db.Document):
displayType= StringField(required=True)
section= ReferenceField(ScoreDocument,db_field='section',required=True)
meta = {
'collection': 'score',
}
由于这两个 API 都从同一数据库获取数据,如果从引用文档的“section”字段中删除了某个值,则会导致以下错误,导致 Flask 管理列表视图无法加载。
mongoengine.errors.DoesNotExist: Trying to dereference unknown document DBRef('section', ObjectId('62286f65088c4f1d723574c6'))
在参考字段中使用
reverse_delete_rule=mongoengine.NULLIFY
是一个简单的解决方案。但是,它在这种情况下不起作用,因为文档与唯一的 mongoengine 实例关联,因为它们属于两个不同的 API。
是否有某种方法可以覆盖flaskadmin中的列表视图,以便即使引用字段有丢失/删除的值,它也会加载。
如果有人正在寻找答案
class UpgradedModelView(ModelView):
# This function belongs to the ModelView
def _get_field_value(self, model, name):
try:
return rec_getattr(model, name)
except DoesNotExist:
return "<invalid>"
class ScoreView(UpgradedModelView):
sponsor_column_initial_value = None
column_display_pk = True
column_searchable_list = ['name']
column_filters = ['score']
我创建了一个名为 UpgradedModelView 的类,它继承自 ModelView,具有引用字段的视图继承自此类,每次在 Flask 管理中加载视图时,都会调用 _get_field_value 函数,现在如果我获得引用,就可以解决问题不再存在的领域,
except DoesNotExist:
return "<invalid>"
我发现错误并返回“无效”字符串。然后我可以稍后手动删除记录或为其编写脚本