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) можно использовать декларативное через некоторые хаки. Следующая версия сделает это намного проще, а после этого примеры будут перенесены также в декларативный.