3

キャメロットのドキュメントには、エリクサーモデルを使用していると書かれています。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.py46-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/宣言型モデルをどのように使用できますか?

4

2 に答える 2

2

Declarative を使用して Camelot の Movie モデルを定義するサンプル コードを次に示します。説明については、こちらを参照してください。

import sqlalchemy.types
from sqlalchemy import Column
from sqlalchemy.ext.declarative import ( declarative_base, 
                                         _declarative_constructor )

from camelot.admin.entity_admin import EntityAdmin
from camelot.model import metadata
import camelot.types

from elixir import session

class Entity( object ):

    def __init__( self, **kwargs ):
        _declarative_constructor( self, **kwargs )
        session.add( self )

Entity = declarative_base( cls = Entity, 
                           metadata = metadata,
                           constructor = None )

class Movie( Entity ):

    __tablename__ = 'movie'

    id = Column( sqlalchemy.types.Integer, primary_key = True )
    name = Column( sqlalchemy.types.Unicode(50), nullable = False )
    cover = Column( camelot.types.Image(), nullable = True )

    class Admin( EntityAdmin ):
        list_display = ['name']
        form_display = ['name', 'cover']
于 2012-03-24T15:47:50.863 に答える
1

どのバージョンの Camelot を使用していますか?

Camelot の現在のバージョン (11.12.30) では、いくつかのハックを通じて Declarative を使用することができます。今後のバージョンではより簡単になりますが、その後、例は宣言型にも移植される予定です。

于 2012-03-12T14:58:56.903 に答える