2016-10-30 5 views
0

私はFlags-AdminをMongoengineと併用しようとしています。私は "永続的なフィルタ"を実装するソリューションを見つけることができません。つまり、ユーザーはmongoengineのカスタムクエリの結果である、ビュー(リスト)内の項目のみを表示して操作する必要があります。Flask-Admin with mongoengine - ビューに「永続フィルタ」を設定するには?

私はモデル

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

を持っていると私は最初のビューで特定のユーザーに応じた書籍のみを表示したい場合は、私はクエリを実行します:

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

と私が欲しい場合

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

私はカスタムフラスコ管理者-VIにそれを実装する方法:ピーター延滞図書を表示するために、私は、クエリを行うだろうew? 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') 

しかし、どのようにこれを実装するためにあります?

ありがとうございました! MongoDBの中

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) 

:ここ

小テスト・ソースのpjcunninghamからソリューションです

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

はどうもありがとうございました!できます!

答えて

2

get_queryを上書きしてください。例えば

class OverdueBooks(ModelView): 

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

ありがとうございました! 私はあなたに質問することができます。トピック「フィルタを使用したフィルタリング」についての詳細はどこにありますか? –

+0

@Henrich Schlegal - [SQLAlchemyビュー](http://flask-admin.readthedocs.io/en/latest/api/mod_contrib_sqla/#flask_admin.contrib.sqla.ModelView.get_query)のソースで簡単なメモが見つかりました。 )。 mongoengineには 'get_count_query'をオーバーライドする必要がない点に似たメモがあります。 – pjcunningham

+0

すべての例はSQLAlchemyについてです!そしてAmazonにMongoengineに関する本は1つしかなく、ポルトガル語で書かれています! mongoengineを学ぶことは非常に難しいです。再度、感謝します! –

関連する問題