sqlalchemy建立了一种关系

时间:2013-10-05 19:54:38

标签: python 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__
    )

使用以下声明发生错误:

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

1 个答案:

答案 0 :(得分:1)

似乎有一些代码没有发布,因为只运行此代码也会给你带来其他错误(例如,与__tablename__属性没有正确设置有关)。但是,您获得的实际错误可能与此代码有关...

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

根据relationship function的文档,第一个参数应该是......

  

表示目标的映射类或实际Mapper实例   关系。

但是,您使用的是__tablename__属性,该属性应该只是表格的名称(字符串)。

因此,请尝试将其更改为...

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