使用mongoengine的Flask-Admin - 如何在视图上设置“持久性过滤器”?

时间:2016-10-30 10:04:59

标签: python mongoengine flask-admin

我尝试使用带有Mongoengine的Flask-Admin,我完全陷入困境。我找不到实现“持久性过滤器”的解决方案。我的意思是,用户应该只能看到视图(列表)中的项目并与之交互,这些项目是由mongoengine中的自定义查询产生的。

如果我有模特

class User(Document):
    name = StringField()
    days = DecimalField()
    book = StringField()

我希望在第一个视图中只显示取决于特定用户的书籍,我会进行查询:

user_peter = User.objects(name=’Peter’)

如果我想为Peter展示逾期的书籍,我会查询:

overdue_books = User.objects(name=’Peter’, days__gt=28)

如何在自定义flask-admin-view中实现它?我必须在ModelView中设置什么?

Class LentBooks(ModelView):
    menu_class_name=”Your Books”
    #???

Class OverdueBooks(ModelView):
    menu_class_name=”Overdue Books”
    #???

还是我必须把它放在这里?

Admin.add_view(LentBooks(model=User, #???))

对于SQLAlchemy,有很多食谱,但不适用于mongoengine。请帮忙!

我发现的是在flask_admin.contrib.mongoengine.filters

class FilterEqual(BaseMongoEngineFilter):
    def apply(self, query, value):
        flt = {'%s' % self.column.name: value}
        return query.filter(**flt)

    def operation(self):
        return lazy_gettext('equals')

但是如何实现这个??

谢谢你pjcunningham !!

以下是 pjcunningham 在小型测试源中的解决方案:

from flask import Flask
import flask_admin as admin
from flask_mongoengine import MongoEngine
from flask_admin.contrib.mongoengine import ModelView

app = Flask(__name__)

app.config['SECRET_KEY'] = '1234567890'
app.config['MONGODB_SETTINGS'] = {'db': 'library'}

db = MongoEngine()
db.init_app(app)

class User(db.Document):
    name = db.StringField()
    days = db.DecimalField()
    book = db.StringField()

class OverdueBooks(ModelView):
    def get_query(self):
        overdue_books = User.objects(name='Peter', days__gt=28)
        return overdue_books

if __name__ == '__main__':

    admin = admin.Admin(app, 'Example: Library')

    admin.add_view(OverdueBooks(model=User, name='Library'))

    app.run(debug=True)
MongoDB中的

{ "_id" : ObjectId("5815f403e198515188860e3c"), "name" : "Jane", "days" : 21, "book" : "Testbook1" }
{ "_id" : ObjectId("5815f416e198515188860e3d"), "name" : "Peter", "days" : 30, "book" : "Testbook2" }

非常感谢!它有效!

1 个答案:

答案 0 :(得分:2)

在视图中覆盖get_query。 e.g。

class OverdueBooks(ModelView):

    def get_query(self):            
        overdue_books = User.objects(name=’Peter’, days__gt=28)
        return overdue_books