即使引用字段丢失/删除,也加载 Flask admin ListView

问题描述 投票:0回答:1

我用 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中的列表视图,以便即使引用字段有丢失/删除的值,它也会加载。

python mongodb mongoengine flask-admin
1个回答
0
投票

如果有人正在寻找答案

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>"

我发现错误并返回“无效”字符串。然后我可以稍后手动删除记录或为其编写脚本

© www.soinside.com 2019 - 2024. All rights reserved.