2017-08-08 15 views
0

カスタムバッチアクションを追加しようとしていますが、このエラーが発生しているので、インポートしたものをコードに追加して、私のモデルファイルとは別の、これは私のviews.pyファイルAttributeError:タイプオブジェクト 'ページ'には 'query'属性がありません

views.py

import flask_admin as admin 
import textwrap 
from flask_admin.actions import action 
from flask_admin.contrib import sqla 
from flask_admin.contrib.sqla import ModelView 
from flask_admin.contrib.sqla.filters import FilterEqual 
from app.models import FileRegister, FileRegisterStatus 
from app import app, db, models 


class PageView(ModelView): 
    @action("active", "Active", 'Are you sure you want to active selected pages?') 
def action_active(self, ids): 
    try: 
     query = Page.query.filter(Page.id.in_(ids)) 

     count = 0 
     for page in query.all(): 
      page.is_active = True  
      count += 1 

     flash(ngettext('Page was successfully activated.', 
         '%(count)s pages were successfully activated.', 
         count, 
         count=count)) 
    except Exception as ex: 
     if not self.handle_view_exception(ex): 
      raise 

     flash(gettext('Failed to active pages. %(error)s', error=str(ex)), 'error') 

models.py

from sqlalchemy.orm import relationship 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, String, Boolean, TIMESTAMP, ForeignKey 
import datetime 

Base = declarative_base() 


class Page(Base): 
    __tablename__ = 'page' 
    id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) 
    page_name= Column(String(500), index=True, nullable=False) 
    is_page_active= Column(Boolean()) 

    def __init__(self, page_name, is_page_active): 
     self.page_name= page_name 
     self.is_page_active= is_page_active 

    def __unicode__(self): 
     return self.page_name 
です

これは、コードを実行した後に取得するトレースバック(直近の最後のコール)です。セッションの代わりにマップされたクラスでquery()を呼び出すので、

Traceback (most recent call last): 
    File "C:\page\env\lib\site-packages\flask\app.py", line 1997, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "C:\page\env\lib\site-packages\flask\app.py", line 1985, in wsgi_app 
    response = self.handle_exception(e) 
    File "C:\page\env\lib\site-packages\flask\app.py", line 1540, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "C:\page\env\lib\site-packages\flask\app.py", line 1982, in wsgi_app 
    response = self.full_dispatch_request() 
    File "C:\page\env\lib\site-packages\flask\app.py", line 1614, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "C:\page\env\lib\site-packages\flask\app.py", line 1517, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "C:\page\env\lib\site-packages\flask\app.py", line 1612, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "C:\page\env\lib\site-packages\flask\app.py", line 1598, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "C:\page\flask_admin\base.py", line 69, in inner 
    return self._run_view(f, *args, **kwargs) 
    File "C:\page\flask_admin\base.py", line 368, in _run_view 
    return fn(self, *args, **kwargs) 
    File "c:\page\flask_admin\model\base.py", line 2145, in action_view 
    return self.handle_action() 
    File "C:\page\flask_admin\actions.py", line 117, in handle_action 
    response = handler[0](ids) 
    File "C:\page\app\views.py", line 28, in action_active 
    if not self.handle_view_exception(ex): 
    File "c:\page\flask_admin\contrib\sqla\view.py", line 1060, in handle_view_exception 
    return super(ModelView, self).handle_view_exception(exc) 
    File "C:\page\app\views.py", line 16, in action_active 
    query = Page.query.filter(Page.active_ind.in_(ids)) 
AttributeError: type object 'Page' has no attribute 'query' 
+0

使用されているクラス/パッケージを知らなくても、 'query = Page.query()。filter(Page.id.in_(ids))'を試してみてください。 –

+0

@RobMurray私のパッケージを追加しました。私はモデルクラスでページモデルを使用します – ghost

+0

宣言型モデルを使用しているので、セッションオブジェクトを作成し、そのモデルに基づいてクエリを実行したいと思います。 'session.query(Page).filter_by(Page.id.in_(ids))'の行に沿った何か。 SQLAlchemyページの[here](http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#adding-and-updating-objects)セクションを参照してください。 – shiv

答えて

0

私は宣言型モデルを使用していたので、これが修正されました。これはmodels.pyファイルに入っています

from sqlalchemy import create_engine 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import scoped_session, sessionmaker  

engine = create_engine('databaselinkgoeshere', convert_unicode=True) 
    db_session = scoped_session(sessionmaker(autocommit=False, 
              autoflush=False, 
              bind=engine)) 

Base = declarative_base() 
Base.query = db_session.query_property() 
関連する問題