3

Camelot的文档说它使用Elixir模型。由于 SQLAlchemy 已经包含 declarative_base 有一段时间了,所以我在另一个应用程序中使用它而不是 Elixir。现在我想直接在 Camelot 中使用 SQLAlchemy/声明性模型。

Stackoverflow 上有一篇文章说 Camelot与 Elixir无关,并且可以使用不同的模型,但没有说明如何。

Camelot的原版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 定义电影模型的示例代码,可以在此处找到一些解释。

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) 中,可以通过一些技巧来使用声明式。即将发布的版本将使其变得更加容易,而在此之后,示例也将被移植到声明式中。

于 2012-03-12T14:58:56.903 回答