2012-03-12 10 views
3

Camelotのドキュメントでは、Elixirモデルを使用しています。 SQLAlchemyはしばらくの間、declarative_baseをインクルードしていたので、私は別のアプリケーションのためにElixirの代わりにそれを使っていました。今私はCamelotでSQLAlchemy/declarativeモデルを直接使用したいと思います。Python CamelotはElixirに結びついていますか?

postはキャメロットがエリクサーに縛らないであり、異なるモデルを使用することが可能であろうと述べているが、それはどのように言っていないことにStackOverflowにあります。

キャメロットのオリジナル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' 

これはライン46-52のためelixir_admin.pyコードです:このコードは、問題を引き起こしている場合

@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 

、どのように私は変更するメソッドを上書きしませんそれを動作させるためのデフォルトのクエリ?

キャメロットでSQLAlchemy/declarativeモデルを使用するにはどうすればよいですか?

+0

問題を作成するコードを入力してください。 – Nilesh

+1

コードは上記です。違いを見ることができるように、元の 'model.py'コードを追加しました。 – boadescriptor

+0

はい、あなたのコードが 'Test'の' query'属性にアクセスしようとしている文を見つけられませんでした。トレースバックを投稿してください。 – Nilesh

答えて

2

Declarativeを使用してCamelotのムービーモデルを定義するためのサンプルコードをいくつか示しますが、いくつかの説明はhereです。

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'] 
1

使用しているCamelotのバージョンは?

現在のバージョンのCamelot(11.12.30)では、DeclarativeからSome のハックを使用することができます。次のバージョンではそれがはるかに簡単になりますが、その後は例が になり、Declarativeにも移植されます。

+0

これは将来的に宣言型に移植されることを知っておきましょう!私はディストリビューションのパッケージマネージャーを通して10.07を使用しています。それを宣言的にするための方法はありますか? – boadescriptor

+1

新しいプロジェクトでは、10.07を使用しないことをお勧めします。カスタムアクションは11.12よりもはるかに柔軟であるためです。 camelotを簡単にインストールするのは、いくつかの回避策を試すよりはるかに簡単です。 – Erik

+0

インストールされているバージョンのPyQTに問題が発生したため、easy_installバージョンを使用できませんでした。 – boadescriptor

関連する問題