Python Camelot связан с эликсиром? - PullRequest
3 голосов
/ 12 марта 2012

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 24 марта 2012

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

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 голос
/ 12 марта 2012

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

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

...