キャメロットのドキュメントには、エリクサーモデルを使用していると書かれています。SQLAlchemyにはしばらくの間declarative_baseが含まれていたので、別のアプリではElixirの代わりにそれを使用していました。ここで、SQLAlchemy/宣言型モデルをCamelotで直接使用したいと思います。
Stackoverflowには、CamelotがElixirに関連付けられておらず、さまざまなモデルを使用できる可能性があるという投稿がありますが、その方法については説明されていません。
キャメロットのオリジナルmodel.py
には、次のコンテンツのみが含まれています。
import camelot.types
from camelot.model import metadata, Entity, Field, ManyToOne, OneToMany, Unicode, Date, Integer, using_options
from camelot.view.elixir_admin import EntityAdmin
from camelot.view.forms import *
__metadata__ = metadata
SQLAlchemyモデルを追加し、次のように変更model.py
しました。
import camelot.types
from camelot.model import metadata, Entity, Field, ManyToOne, OneToMany, Unicode, Date, using_options
from camelot.view.elixir_admin import EntityAdmin
from camelot.view.forms import *
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
__metadata__ = metadata
Base = declarative_base()
class Test(Base):
__tablename__ = "test"
id = Column(Integer, primary_key=True)
text = Column(String)
うまくいきませんでした。起動するmain.py
と、GUIとTest
サイドバーは表示されますが、行は表示されません。これは、トレースバックの末尾です。
File "/usr/lib/python2.6/dist-packages/camelot/view/elixir_admin.py", line 52, in get_query
return self.entity.query
AttributeError: type object 'Test' has no attribute 'query'
これはelixir_admin.py
46-52行目のコードです。
@model_function
def get_query(self):
""":return: an sqlalchemy query for all the objects that should be
displayed in the table or the selection view. Overwrite this method to
change the default query, which selects all rows in the database.
"""
return self.entity.query
このコードが問題の原因である場合、メソッドを上書きしてデフォルトのクエリを変更して機能させるにはどうすればよいですか?
CamelotでSQLAlchemy/宣言型モデルをどのように使用できますか?