Python Camelot связан с эликсиром?

Документы для Камелота говорят, что он использует модели Elixir. Поскольку SQLAlchemy какое-то время включал декларативную_базу, я использовал ее вместо Elixir для другого приложения. Теперь я хотел бы использовать SQLAlchemy/ декларативные модели непосредственно в Камелоте.

В Stackru есть пост, в котором говорится, что Камелот не привязан к 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Я могу видеть графический интерфейс и 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

Если этот код вызывает проблему, как переписать метод, чтобы изменить запрос по умолчанию, чтобы он работал?

Как вы можете использовать SQLAlchemy/ декларативные модели в Камелоте?

2 ответа

Решение

Вот некоторый пример кода по использованию декларативного для определения модели Movie для Camelot, некоторые объяснения можно найти здесь.

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

Какую версию Камелота вы используете?

В текущей версии Camelot (11.12.30) можно использовать декларативное через некоторые хаки. Следующая версия сделает это намного проще, а после этого примеры будут перенесены также в декларативный.

Другие вопросы по тегам