2013-10-05 107 views
1

我試圖在兩個表格之間創建關係。sqlalchemy設置關係

當實例化一個模型,我得到以下錯誤:

from core.models import Activation 
a = Activation() 
ArgumentError: Class object expected, got 'Table(u'activations', MetaData(bind=Engine(postgresql+psycopg2://localhost:5432/mydb)), Column('id', Integer(), table=<activations>, primary_key=True, nullable=False), Column('valid_until', DateTime(), table=<activations>), Column('code', Unicode(length=30), table=<activations>, nullable=False), Column('created_by', Unicode(length=16), table=<activations>, nullable=False), schema=None)'. 

核心/ models.py

class ActivationMixin(Base): 

    @declared_attr 
    def code(self): 
    return Column(Unicode(30), nullable=False, unique=True) 

    @declared_attr 
    def valid_until(self): 
    return Column(DateTime, nullable=True) 

    @declared_attr 
    def created_by(self): 
    return Column(Unicode(16), nullable=False) 

    @classmethod 
    def get_by_code(cls, request, code): 
    session = get_session(request) 
    return session.query(cls).filter(cls.code == code).first() 

    def __init__(self, created_by='web', valid_until=None): 
    """Create a new activation. *valid_until* is a datetime. 
    It defaults to 3 days from current day. 
    """ 
    self.code = generate_random_string(24) 
    self.created_by = created_by 

    if valid_until: 
     self.valid_until = valid_until 
    else: 
     self.valid_until = datetime.utcnow() + timedelta(days=3) 

class Activation(ActivationMixin): 
    pass 

用戶/ models.py

class User(Base): 
    email = Column(Unicode(256), nullable=False, unique=True) 
    status = Column(Boolean, default=False) 
    salt = Column(Unicode(32), nullable=False) 
    _password = Column('password', Unicode(256), nullable=False) 
    logins = Column(Integer, default=0) 
    last_login = Column(
     TIMESTAMP(timezone=False), 
     default=func.now(), 
     server_default=func.now(), 
     nullable=False 
) 
    account_type = Column(AccountType.db_type()) 

    @declared_attr 
    def activation_id(self): 
    return Column(
     Integer, 
     ForeignKey('%s.id' % (Activation.__tablename__)) 
    ) 

    @property 
    def is_activated(self): 
    if self.activation_id is None: 
     return True 

    return False 

    @declared_attr 
    def activation(self): 
    return relationship(
     Activation.__tablename__, 
     backref=self.__tablename__ 
    ) 

錯誤與occures以下聲明:

@declared_attr 
def activation(self): 
    return relationship(
     Activation.__tablename__, 
     backref=self.__tablename__ 
    ) 

回答

1

似乎有一些代碼因爲運行該代碼會給你其他錯誤(例如,與__tablename__屬性未正確設置有關),因此你還沒有發佈代碼。但是,你所得到的實際誤差可能是與此相關的代碼...

@declared_attr 
def activation(self): 
    return relationship(
     Activation.__tablename__, 
     backref=self.__tablename__ 
    ) 

根據對relationship function的文件,第一個參數應該是...

a mapped class, or actual Mapper instance, representing the target of the relationship.

但是,你是使用__tablename__屬性,該屬性應該只是表的名稱(字符串)。

因此,嘗試改變這...

@declared_attr 
def activation(self): 
    return relationship(
     Activation, 
     backref=self.__tablename__ 
    ) 
+0

感謝這正是它。 – slik